BC break při přechodu z Nette 2.0.8 na 2.1 – jak dostat data do jednoho selection?
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- thunderbuff
- Člen | 164
Ahoj, ve své aplikaci jsem přešel na dev verzi nette, která mi zadělala na problém. Potřebuji dosat do gridu data ze dvou tabulek (vím, že je to proti filozofii selection, ale jsem limitován gridem, který už nemohu vyměnit)
<?php
// V nette 2.0.8 fungovalo - vytvořil se jednoduchý join s where pro tabulku contact_contactlist
$selection = $connection
->select('contact.*, contact_contactlist.status')
->where('contact_contactlist:contactlist_id', $ids);
/**
Výsledek:
SELECT `contact_contactlist`.`status`, `contact`.*
FROM `contact`
INNER JOIN `contact_contactlist` ON `contact`.`id` = `contact_contactlist`.`contact_id`
WHERE (`contact_contactlist`.`contactlist_id` IN (33))
*/
// V nette 2.1 ovšem dvojtečka nefunguje, tak jsem zkoušel zápis trochu upravit.
$selection = $selectioFactory
->select('contact.*, contact_contactlist.status')
->where(':contact_contactlist.contactlist_id', $ids);
/**
Výsledkem je tahle nefunkční příšernost, ve druhém joinu se ptá na neexistující slupce:
SELECT `contact`.*, `contact_contactlist`.`status` FROM `contact`
LEFT JOIN `contact_contactlist` ON `contact`.`id` = `contact_contactlist`.`contact_id`
LEFT JOIN `contact_contactlist` ON `contact`.`contact_contactlist_id` = `contact_contactlist`.`id`
WHERE (`contact_contactlist`.`contactlist_id` IN (33))
*/
// Pokud z předchozího příkladu odstraním dotaz na data z druhé tabulky, tedy:
$selection = $selectioFactory
->select('contact.*')
->where(':contact_contactlist.contactlist_id', $ids);
/**
Vygeneruje to krásný dotaz, ale chybí mi ten sloupec :-)
SELECT `contact`.* FROM `contact`
LEFT JOIN `contact_contactlist` ON `contact`.`id` = `contact_contactlist`.`contact_id`
WHERE (`contact_contactlist`.`contactlist_id` IN (?))
?>
Máte nějaký tip, jak dostat všechna data, co potřebuji, do jednoho selection?
Editoval thunderbuff (3. 11. 2013 12:49)
- hrach
- Člen | 1844
Z hlavy:
$selection = $selectioFactory
->select('contact.*, :contact_contactlist.status')
->where(':contact_contactlist.contactlist_id', $ids);
Na contact_contactlist se musis odkazovat porad stejne. To, ze si to ve where prijounoval spravne jeste neznamena, ze v selectu se pouzija ta prvni definice :) Aktualni chovani povazuji za spravne.