recherche

Maison  >  Questions et réponses  >  le corps du texte

doctrine2 - Comment trier le tableau d'entités correspondant lors de l'utilisation du mappage un-à-plusieurs Doctrine dans Symfony?

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.

给我你的怀抱给我你的怀抱2793 Il y a quelques jours696

répondre à tous(2)je répondrai

  • 伊谢尔伦

    伊谢尔伦2017-05-16 16:45:51

    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 < 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🎜

    répondre
    0
  • 我想大声告诉你

    我想大声告诉你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;
    }

    répondre
    0
  • Annulerrépondre