select z propojené tabulky podle jiného názvu klíče, jak přepsat ref() do selectu
- ludek
- Člen | 83
Zdravím,
Mám tabulku users se seznamem uživatelů. Potom tabulku projektů, kde uživatelé mohou být v různých rolích:
table: projects
id
author_id //--> users.id
maintainer_id //--> users.id
manager_id //--> users.id
Potřebuji jednoduše v SELECTu získat jméno autora projektu přes author_id. Toto je v pořádku:
$table = $dbContext->table('projects');
$test = $table->fetch();
dump($test->ref('users', 'author_id')->name);
Když se ale pokouším vyrobit datový zdroj pro TwiGrid takto
$table->select('projects.id AS id, (users.author_id).name AS author');
/* nebo :*/ users.author_id.name
/* nebo :*/ (users, author_id).name
// a různé další varianty se závorkami, dvojtečkou, atd...
dostanu No reference found
nebo
SQL error
v případě, že použiju čárku, jak je popsáno
v Přímé
definici joinu.
Prostě nevím a nemůžu najít, jak přepsat ->ref()
do
selectu. Můžete mi prosím poradit? Dík.
- David Matějka
- Moderator | 6445
tamta syntaxe imho jeste neni implementovana, zkus
$table->select('projects.id AS id, author.name AS author');
- ludek
- Člen | 83
matej21 napsal(a):
`
php
$table->select(‚projects.id AS id, author.name AS author‘);
Funguje, díky! A skutečně to vyrobí správný JOIN:
SELECT `projects`.`id` AS `id`, `author`.`name` AS `author`
FROM `projects`
LEFT JOIN `users` AS `author` ON `projects`.`author_id` = `author`.`id`
> ```
Takže to je: **`název_cizího_klíče_bez_id.název_pole_z_propojené_tabulky`**. Na to bych sám nepřišel.
- David Matějka
- Moderator | 6445
j presneji je to text obsazeny v nazvu sloupecku s FK :). stejne tak to
muzes pouzivat misto $test->ref('users', 'author_id')
→
pouzijes jen $test->author
. nette\database zjisti, ze neexistuje
sloupecek „autohor“, ale ze existuje „author_id“, ktery to slovo
obsahuje a odkazuje na nejakou tu tabulku – stejne tak jako „author“ by
fungovalo (pokud by tam nebyla kolize) „author_i“, „aut“ nebo jen
„a“ :))
- ludek
- Člen | 83
Aha. Takže (abych v tom neměl binec) můžu zadat celý skutečný
název_cizího_klíče.název_pole
, čili
author_id.name AS author, //--> users.id
maintainer_id.name AS maintainer, //--> users.id
manager_id.name AS manager, //--> users.id
To je docela šikovné a jednodušší, než (v budoucnu) vypisování
(users, author_id).name
. Akorát, že z toho na první pohled
není vidět, kam to vede.