select z propojené tabulky podle jiného názvu klíče, jak přepsat ref() do selectu

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

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

tamta syntaxe imho jeste neni implementovana, zkus

$table->select('projects.id AS id, author.name AS author');
ludek
Člen | 83
+
0
-

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

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

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.