Nette\Database join (Column not found)

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

PHP 5.4.3, Nette 2.0.7

Prosím vás vedeli by ste mi poradiť ako správne zapísať tento SQL príkaz pomocou Nette\Database?

SELECT id, username
FROM table1 JOIN table2 ON table1.id = table2.attr1
WHERE
table2.attr2 = $val

Príkaz, čo som vytvoril, je nefunkčný:

$this->getTable()->select('id', 'username')->where("table2.attr2 = $val")

Chyba:
Column not found: 1054 Unknown column 'table1.table2_id' in 'on clause'
 – atribút table2_id tam nemám, vyzerá to tak že Nette si ho vytvoril sám.
Z pomoc vopred ďakujem.

Pozn.: V table2 sú atribúty attr1, attr2 PFK.

Editoval Tom1141 (4. 2. 2013 13:33)

Petr Hudík
Člen | 49
+
0
-

Nejsem si jistý, že jsem úplně pochopil danou strukturu tabulek, tak možná úplně ustřelím úplně špatně. Pomohly by bližší informace, co se snažíš docílit, schéma db, apod.

Předpokládám, že v tabulce1 máš uživatele, pokud každý uživatel má nejvýše jeden řádek v tabulce2, zvážil bych změnu návrhu db schématu, aby v table1 byl sloupec table2_id.

Pokud každý uživatel z tabulky1 může mít více spojení v tabulce2, tak bych (opět) zvážil změnu schématu, tentokrát, aby v tabulce2 byl sloupec table1_id. (za předpokladu, že ID je primární klíč tabulky1).

V tomto případě jsou konvence velice důležité, je jedno jaké zvolíš, výchozí však jsou, že cizí klíč tabulky je označen jménem tabulky podtržítkem a následně primárním klíčem dané tabulky např. table_id, nebo users_id. Můžeš, však použít i jiné konvence. Nezapomeň, že tyto spojení fungují, pouze pokud používáš cizí klíče.

Editoval Petr Hudík (4. 2. 2013 13:56)

Tom1141
Člen | 27
+
0
-

Snažím sa o vytvorenie jednoduchého systému, v ktorom si bude môcť používateľ pridať iných používateľov medzi priateľov. Mám vytvorené 2 tabuľky, User a Relation, v User sú informácie o užívateľoch a Relation udáva vzťah, kto je s kým priateľ. Tabuľka Relation má atribúty: id1, id2, direction. Atribúty id1, id2 sú PFK, direction určuje smer vzťahu (1. žiada 2. / 2. žiada 1. / 1. a 2. sú priatelia). Potrebujem teda napríklad v jednej funkcii vypísať všetkých ľudí, s ktorými je daný užívateľ priateľ. Jediná možnosť v tomto prípade je teda vyššie spomenutý príkaz.

Petr Hudík
Člen | 49
+
0
-

Děkuji za upřesnění. Změna struktury samozřejmě není nutná. V tom případě by to mělo být jednoduché:

<?php
// $user = $db->table('user')->get($id);
$friends = $user->related('relation', 'id2')
?>

a pak si je v šablně můžu vypsat:

{foreach $friends as $friend}
	...
{/foreach}

(Psáno z hlavy, tak snad tam nebude nějaká bota). Je to to co jsi potřeboval?

Tom1141
Člen | 27
+
0
-

Takže $user->related('relation', 'id2') vráti riadky ktoré v tabuľke relation majú id2 = $user->getId() ?

Petr Hudík
Člen | 49
+
0
-

Ano, mělo by.