self-join Nette\Database\Table\Selection

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
freely111
Člen | 41
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

No melo by fungovat presne jak jsem psal – ->select('parent.name AS parent_name') :)