Maison > Questions et réponses > le corps du texte
J'utilise Doctrine pour la cartographie un-à-plusieurs, comme une personne (Personne) et plusieurs enfants (Enfants). J'espère que lorsque j'utilise Doctrine pour obtenir automatiquement des enfants, les enfants pourront être triés par âge.
Excusez-moi : quelle fonction faut-il surcharger pour y parvenir ? persion->Quelle fonction getChildren() appelle-t-elle pour exécuter une requête SQL ?
Il est difficile de trouver des résultats pour un tel besoin, merci de me donner quelques conseils.
伊谢尔伦2017-05-16 16:45:51
Modifier la méthode getChildren
de la classe Person
Person
类的getChildren
方法
<?php
// src/AppBundle/Entity/Person.php
// ...
use Doctrine\Common\Collections\Criteria;
//...
/**
* @param string $orderedByAge "ASC"|"DESC"
*/
public function getChildren($orderedByAge=null)
{
if (null === $orderedByAge) {
return $this->children;
}
if (!in_array(strtoupper($orderedByAge), ['ASC', 'DESC'])) {
throw new \InvalidArgumentException('参数错误,必须是"ASC"或"DESC"中的一个');
}
$order = 'ASC' === $orderedByAge ? Criteria::ASC : Criteria::DESC;
$criteria = Criteria::create()->orderBy(['age' => $order]);
return $this->children->matching($criteria);
}
// ...
如果不想修改getChildren
方法,可以写一个新的方法getChildrenOrderedByAge
,道理同上。
Doctrine
的一对多或者多对多关系中,Entity
中所谓多
的属性是DoctrineCommonCollectionsCollection
接口的某一实现的实例,默认情况下是DoctrineCommonCollectionsArrayCollection
,上述解决方案中用到的就是这一接口的Filtering API
(筛选接口),上述情况下,筛选的条件会最终转化到SQL
rrreee
getChildren
, vous pouvez écrire une nouvelle méthode getChildrenOrderedByAge
, pour la même raison que ci-dessus. Résumé :🎜 🎜Dans la relation un-à-plusieurs ou plusieurs-à-plusieurs de
Doctrine
, ce que l'on appelle l'attribut plusieurs
dans Entité
est le < interface code>DoctrineCommonCollectionsCollection Une instance d'une implémentation est DoctrineCommonCollectionsArrayCollection
par défaut. L'API de filtrage
de cette interface est utilisée dans la solution ci-dessus. Les conditions filtrées seront finalement converties dans la couche SQL
pour être traitées afin d'optimiser les performances. 🎜
🎜Enfin, le lien du document officiel concerné est le suivant : Filtrage des collections🎜我想大声告诉你2017-05-16 16:45:51
C'est bien d'utiliser la méthode de @vinzao, mais Doctirne propose la méthode OrderBy
:
Personne :
<?php
// src/AppBundle/Entity/Person.php
class Person
{
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Children", mappedBy="person")
* @ORM\OrderBy({"age"="DESC"})
*/
protected $childrens;
}
Enfants :
<?php
// src/AppBundle/Entity/Children.php
class Children
{
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Person", inversedBy="childrens")
*/
protected $person;
}