doctrine2 - Comment trier le tableau d'entités correspondant lors de l'utilisation du mappage un-à-plusieurs Doctrine dans Symfony?
给我你的怀抱
给我你的怀抱 2017-05-16 16:43:51
0
2
694

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.

给我你的怀抱
给我你的怀抱

répondre à tous(2)
伊谢尔伦

La solution est la suivante :

Modifier la méthode getChildren de la classe PersonPerson类的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

Si vous ne souhaitez pas modifier la méthode 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 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🎜
我想大声告诉你

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;
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal