Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Symfony & Doctrine, JOIN päring märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
kpihus
Kreisi kasutaja
kpihus

liitunud: 14.04.2003




sõnum 08.10.2013 03:36:38 Symfony & Doctrine, JOIN päring vasta tsitaadiga

Ahoi,

Oleteme et meil on kaks olemit, olgu selleks näiteks Category ja Product, stiilis:

Category - 1 -------------1...*- Product

Kui me tahame leida tooted ja koos nende kategooriatega, siis see on imelihtne:

    $query = $this->getEntityManager()
        ->createQuery('
            SELECT p, c FROM SomeBundle:Product p
            JOIN p.category c);


Tekib tulemus stiilis:
Toode1
|----Kategooria1

Toode2
|----Kategooria 1


Kuidas aga joinida juhul kui me tahame pärida kõik kategooriad ja neisse kuulvad tooted.
Tulemus peaks olema selline:

Kategooria1
|----Toode1
|----Toode2

Kategooria2
|---- null
Kommentaarid: 26 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 25
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
2korda2
HV kasutaja

liitunud: 19.07.2003




sõnum 08.10.2013 10:33:01 vasta tsitaadiga

select k.nimi, p.nimi
from kategooria k
left outer join produkt p on (p.kategooria_id=k.id) --eeldan, et mudelis kuulub produkt ainult ühe kategooria alla ja seos on sedasi tehtud
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
kpihus
Kreisi kasutaja
kpihus

liitunud: 14.04.2003




sõnum 14.10.2013 16:21:59 vasta tsitaadiga

Ei ole ikka päris see. Lähme rohkem detaili. Panen siia postituse mille kirjutasin Symfony foorumisse, kindlasti on meil siin kodumaal ka helgeid päid, kes läbi ammustavad, milles kühvel. Sorry et inglise keeles, aga ju itimees inglise keelest ikka aru saab.

---------------------

Ok, lets make it little more clear with real life case.

I have four entities: AdminBundle:Employee, AtuhBundle:Login, AdminBundle:Employeephone and AdminBundle:EmployeEemal.

Of course they have relatons to each other:

Employee

    /**
     * @var Doctrine\Common\Collections\ArrayCollection $login
     * @ORM\OneToMany(targetEntity="Crm\AuthBundle\Entity\Login", mappedBy="employee_id", cascade={"persist"})
     */
    protected $login;

    /**
     * @var Doctrine\Common\Collections\ArrayCollection $phone
     * @ORM\OneToMany(targetEntity="Crm\AdminBundle\Entity\EmployeePhone", mappedBy="employee_id", cascade={"persist"})
     */
    protected $phone;

    /**
     * @var Doctrine\Common\Collections\ArrayCollection $email
     * @ORM\OneToMany(targetEntity="Crm\AdminBundle\Entity\EmployeeEmail", mappedBy="employee_id", cascade={"persist"})
     */
    protected $email;
 

Login

    /**
     * @ORM\ManyToOne(targetEntity="Crm\AdminBundle\Entity\Employee", inversedBy="login", cascade={"persist"})
     * @ORM\JoinColumn(name="employee_id", referencedColumnName="id") 
     */
    protected $employee;
 

Phone

    /**
     * @ORM\ManyToOne(targetEntity="Crm\AdminBundle\Entity\Employee", inversedBy="login", cascade={"persist"})
     * @ORM\JoinColumn(name="employee_id", referencedColumnName="id")
     */
    private $employee;
 

Email

    /**
     * @ORM\ManyToOne(targetEntity="Crm\AdminBundle\Entity\Employee", inversedBy="login", cascade={"persist"})
     * @ORM\JoinColumn(name="employee_id", referencedColumnName="id")
     */
    private $employee;
 


Now i want to rul query what gets list of all users with their primary phone and email (only one is primary), in sql i would write this query like this:

SELECT * FROM `login`
LEFT JOIN `employee` on `login`.`employee_id` = `employee`.`id`
LEFT JOIN `employeephone` on `employee`.`id` = `employeephone`.`employee_id`
LEFT JOIN `employeeemail` on `employee`.`id` = `employeeemail`.`employee_id`
WHERE `employeephone`.`is_primary`=1
AND `employeeemail`.`is_primary`=1


But i can't figure out, how it should look like on Doctrine world.
I tried to do it like this:

class EmployeeRepository extends EntityRepository {

    public function getAllEmployees() {
        $dql = "SELECT e, l, p, m FROM AuthBundle:Login l
                JOIN l.employee e
                JOIN e.phone p 
                JOIN e.email m";
        $query = $this->getEntityManager()->createQuery($dql);
        try {
            return $query->getArrayResult();
        } catch (\Doctrine\ORM\NoResultException $e) {
            return null;
        }
    }

}


But it gives me little nice error:
tsitaat:

Notice: Undefined index: employee_id in C:\wamp\www\Symphony\vendor\doctrine\orm\lib\Doctrine\ORM\Query\SqlWalker.php line 826


I've tried several other methods, but all of them lead me to different errors. So how to do it correctly ?
Kommentaarid: 26 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 25
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Symfony & Doctrine, JOIN päring
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.