doctrine2 - Bagaimana untuk mengisih tatasusunan Entiti yang sepadan apabila menggunakan pemetaan satu-ke-banyak Doktrin dalam symfony?
给我你的怀抱
给我你的怀抱 2017-05-16 16:43:51
0
2
669

Saya menggunakan Doktrin untuk pemetaan satu-ke-banyak, seperti satu orang (Orang) dan berbilang kanak-kanak (Kanak-kanak, saya harap apabila menggunakan Doktrin untuk mendapatkan Kanak-kanak secara automatik, kanak-kanak itu boleh diisih mengikut umur).

Maafkan saya: Fungsi manakah yang perlu dibebankan untuk mencapai matlamat ini? persion->Fungsi yang manakah getChildren() memanggil untuk melaksanakan pertanyaan SQL?

Sukar untuk mencari keputusan untuk keperluan sedemikian, sila berikan saya nasihat.

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

membalas semua(2)
伊谢尔伦

Penyelesaian adalah seperti berikut:

Ubah suai kaedah getChildren kelas OrangPerson类的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

Jika anda tidak mahu mengubah suai kaedah getChildren, anda boleh menulis kaedah baharu getChildrenOrderedByAge, sebab yang sama seperti di atas.

Ringkasan:🎜 🎜Dalam hubungan satu-ke-banyak atau banyak-ke-banyak Doktrin, atribut yang dipanggil banyak dalam Entiti ialah DoctrineCommonCollectionsCollection Contoh pelaksanaan ialah DoctrineCommonCollectionsArrayCollection secara lalai API Penapisan (antara muka penapisan) antara muka ini digunakan dalam penyelesaian di atas kes di atas, Keadaan yang ditapis akhirnya akan ditukar kepada lapisan SQL untuk diproses bagi mencapai pengoptimuman prestasi. 🎜 🎜Akhir sekali, pautan dokumen rasmi yang berkaitan adalah seperti berikut: Koleksi Penapisan🎜
我想大声告诉你

Tidak mengapa menggunakan kaedah @vinzao, tetapi Doctirne menyediakan kaedah OrderBy:

Orang:

<?php

// src/AppBundle/Entity/Person.php

class Person
{
    /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Children", mappedBy="person")
     * @ORM\OrderBy({"age"="DESC"})
     */
    protected $childrens;
}

Kanak-kanak:

<?php

// src/AppBundle/Entity/Children.php

class Children
{
    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Person", inversedBy="childrens")
     */
    protected $person;
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan