self-join Nette\Database\Table\Selection
- freely111
- Člen | 41
Ahoj,
jsem nette nováček a předem se omlouvám, pokud pokládám duplicitní
otázku, ale odpověď jsem ve fórum apod. nenašel.
Snažím se vytvořit spojení na stejnou tabulku, pomocí sloupce acl_role.parent_id, který odkazuje na primární klíč acl_role.id stejné tabulky.
Pokud napíšu:
<?php
$selection = $this->db->table('acl_role')
->select('acl_role.name AS name, :acl_role.name AS parent_name');
?>
Tak obdržím SQL, který má obráceně ve spojení podmínku.
SELECT `acl_role`.`name` AS `name`, `acl_role_ref`.`name` AS `parent_name`
FROM `acl_role`
LEFT JOIN `acl_role` AS `acl_role_ref` ON `acl_role`.`id` = `acl_role_ref`.`parent_id`
Já bych potřeboval obdržet tento sql dotaz:
ON acl_role
.parent_id
=
acl_role_ref
.id
SELECT `acl_role`.name, `acl_role_ref`.`name` AS `parent_name`
FROM `acl_role`
LEFT JOIN `acl_role` AS `acl_role_ref` ON `acl_role`.`parent_id` = `acl_role_ref`.`id`
Předem děkuji za radu
- David Matějka
- Moderator | 6445
tohle je „has one“ smer, takze parent.name AS parent_name
(viz doc)…
(btw, vybirat data z vice tabulek je proti filozofii ndbt, mel bys pouzit ref:
https://doc.nette.org/…ase/explorer#…)
- freely111
- Člen | 41
David Matějka napsal(a):
tohle je „has one“ smer, takze
parent.name AS parent_name
(viz doc)… (btw, vybirat data z vice tabulek je proti filozofii ndbt, mel bys pouzit ref: https://doc.nette.org/…ase/explorer#…)
Díky za reakci a usměrnění, já to původně měl tak, že vyberu všechny záznamy a spojení na stejnou tabulku dělám při iteracích ActiveRow:
<?php
$item->ref('acl_role', 'parent_id')->name;
?>
- Díky za vylepšení, tohle je hezčí:
<?php
$item->parent->name;
?>
Ale pořád mě hlodalo, jak to udělat bez toho, ale je to porušení toho co se píše hned v úvodu a tak jak píšeš „Hlavní myšlenkou je načítání dat pouze z jedné tabulky a tak, aby se tyto dotazy pokládaly jen jednou.“
Ale i tak by mě zajímalo, jestli existuje možnost, že select:
$this->db->table(‚acl_role‘)->select(…)
usměrním tak, aby mi podmínky v left join otočil. Ale jestli je to blbost,
tak dotaz ignorujte :)
- David Matějka
- Moderator | 6445
No melo by fungovat presne jak jsem psal –
->select('parent.name AS parent_name')
:)