Nedaří se použití related

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

Ahoj, používám datagrid pro nette database a chci si do něj poslat data.
Mám dvě tabulky, jednu users a druhou tasks. Chci zobrazit vsechny tasky a uživatele kterým jsou přiřazeny a tento seznam chci zobrazit pouze autorovi tasku. Cili v tasks mam sloupce id_user(autor) a id_client(tomu je task přiřazen). Dotaz mam takto:

$this->table = $this->context->createTasks();
$this->table->get($this->presenter->user->getId())
		->related('users')
		->through('id_client')

dotaz pošlu do gridu a hlásí mi to:
Call to a member function related() on a non-object
Volám tedy related nějak špatně? Koukal jsem v dokumentaci, ale přijde mi že to mám dobře. Poradíte z nette database začínám. Díky

ricco24
Člen | 141
+
0
-

Keď si výsledok dotazu vypíšeš pomocou Debuggeru chybu ti nevyhodí ?

spiider
Člen | 162
+
0
-

To hlásí to stejný

vvoody
Člen | 910
+
0
-

Funkcia get musela vratit FALSE. Myslim ze ale problem bude v tom ze primarny kluc tabulky Tasks logicky nemoze byt IDcko uzivatela :) takze v tvojom pripade si narazil na pripad ked idcko uzivatela sa nerovna idcku ziadneho tasku.

Skus nieco taketo:

$this->users = $this->context->createUsers();
$user = $this->users->get($this->presenter->user->getId());
$tasks = $user->ref('tasks','id_client');
foreach($tasks as $task){
	$task; // a tu mas jednotlive tasky
}

Pisem to na slepo, snad to pojde. Samozrejme bude treba nadefinovat, ak este nemas, tovarnicku v configu pre users aby islo createUsers().

spiider
Člen | 162
+
0
-

Zkusil jsem to jak si psal, ale hlasi to stejnou chybu jak u related: Call to a member function ref() on a non-object

vvoody
Člen | 910
+
0
-

skopiruj prosim ten kus kodu aj cast configu kde mas factories

spiider
Člen | 162
+
0
-

Config:

factories:
		users: Users
		tasks: Tasks

a v komponentě Tasks, která by mi je mela vypsat:

$user = $this->table->get($this->presenter->user->getId());
$tasks = $user->ref('tasks', 'id_client');

kde $this->table je

$this->context->createTasks();
vvoody
Člen | 910
+
0
-

Stale vkladas ID uzivatela do funkcie ktora predpoklada ze jej davas ID tasku.

To riesenie co som ti postol hore je sice skrabanie sa pravou rukou za lavym uchom, ale fungovala by bez problemu. Neuvedomil som si ze tebe stacia tasky.

Takze aby si to aj pochopil, ekvivalent tvojho kodu, ktory ti nefunguje, je

$this->table = $this->context->createTasks();
$user = $this->table->where('id',$this->presenter->user->getId());
$tasks = $user->ref('tasks', 'id_client');

(predpokladam ze stlpec s primarnym klucom v tabulke tasks je id)

Funkcne riesenie: ak si v tom strateny tak rovno preskoc na „spravne riesenie“ :D

// zobrat tabulku users
$this->table = $this->context->createUsers();

// vybrat prihlaseneho uzivatela
$user = $this->table->where('id',$this->presenter->user->getId())->fetch();
// v tomto pripade to je to iste ako
// $user = $this->table->get($this->presenter->user->getId());

// a zistit jeho tasky
$tasks = $user->ref('tasks', 'id_client');

Spravne riesenie

//zobrat tabulku tasks
$this->context->createTasks();

// vybrat tasky ktore patria prihlasenemu uzivatelovy
$tasks = $this->table->where('id_client',$this->presenter->user->getId());

V tomto pripade nemozes pouzit get() tak ako si to robil ty, lebo ‚id_client‘ nieje primarny kluc v tabulke tasks.

spiider
Člen | 162
+
0
-

Ale já potřebuju do výpisu i jméno a příjmení z tabulky users. Tabulka tasks obsahuje sloupce id_task,id_user – fk z tabulky users kdo task vytvořil, id_client-fk z tabulky users komu byl úkol přiřazen
A prostě potřebuju do datagridu předat selection které bude obsahovat detaily o ukolu z tabulky tasks + jméno a příjmení komu byl úkol zadán – z tabulky users. Snad jsem to napsal srozumitelně :) díky

vvoody
Člen | 910
+
0
-

Aha, mal som si lepsie precitat prvy post :). Nemyslim si ze toto je mozne, (kto by to preboha kodil :D ) mozes mi linknut ten datagrid?

Edit: ale ak by si nepotreboval featury datagridu, tak jednoducho to vypisat do tabulky neni problem.

Editoval vvoody (4. 5. 2012 20:05)

spiider
Člen | 162
+
0
-

je to tento grid :https://github.com/…tte-datagrid

Editoval spiider (4. 5. 2012 20:10)

vvoody
Člen | 910
+
0
-

Ja tam vasede vidim dibi. Nehovoril si ze to je datagrid pro nette database?

spiider
Člen | 162
+
0
-

Omlouvám se asi jsem hodil špatný link, mám to z tohoto vlákna https://forum.nette.org/…p-5-3-notorm

Editoval spiider (5. 5. 2012 11:16)

vvoody
Člen | 910
+
0
-

Tak predsa v Selection ide nejako joinovat, no v dokumentacii to nieje, ona by ten join spravila aj automatika ale v taskoch mas dva kluce odkazujuce na tu istu tabulku (users) takze tomu Selection treba nejako napovedat, neviem ako, skus npr toto:

$tasks = $this->context->createTasks();
$tasks->select('tasks.*, users.name AS user_name')
	->where('tasks.id_client = users.id')
	->where('id_client',$this->presenter->user->getId());

a v datagride pridat stlpec

$dg->addColumn('user_name', 'Task vytvoril')->setTextFilter('users.name');
spiider
Člen | 162
+
0
-

Mám to teda takhle:

$this->user = $this->context->createTasks();
$user = $this->table->select('tasks.*, users.lname')
        ->where('tasks.id_client = users.id')
        ->where('id_user',$this->presenter->user->getId());

Hlásí to:No reference found for $tasks->users přitom cizí klíče mám nastavené takže nevím proč to nejde stále.

vvoody
Člen | 910
+
0
-

ten prvy riadok nechapem, nechcel ho napisat takto?

$this->table = $this->context->createTasks();

Ked to hlasi chybu tak by bolo super sem skopirovat sen kod a napisat na ktorom riadku to vyhodilo ten error. Uplne najsuper by bolo keby si mohol dat odkaz na ladenku.

spiider
Člen | 162
+
0
-

Chyba je zde: File: …/libs/Nette/Database/Reflection/DiscoveredReflection.php Line: 140

139:            if (!$refresh) {
140:                throw new \PDOException("No reference found for \${$table}->{$key}.");
141:            }
ricco24
Člen | 141
+
0
-

Postni sem prosím ťa štruktúru tabuliek Users a tasks.

spiider
Člen | 162
+
0
-

CREATE TABLE tasks (
id_task int(10) NOT NULL AUTO_INCREMENT,
id_user int(10) NOT NULL,
id_client int(10) NOT NULL,
text text CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL,
created datetime NOT NULL,
completed datetime NOT NULL,
type int(3) NOT NULL,
status tinyint(1) NOT NULL DEFAULT ‚0‘,
PRIMARY KEY (id_task),
KEY id_client (id_client),
KEY id_user (id_user),
CONSTRAINT tasks_ibfk_1 FOREIGN KEY (id_client) REFERENCES users (id),
CONSTRAINT tasks_ibfk_2 FOREIGN KEY (id_user) REFERENCES users (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE users (
id int(10) NOT NULL AUTO_INCREMENT,
fname varchar(20) COLLATE utf8_czech_ci NOT NULL,
lname varchar(40) COLLATE utf8_czech_ci NOT NULL,
email varchar(40) COLLATE utf8_czech_ci NOT NULL,
role varchar(30) COLLATE utf8_czech_ci NOT NULL,
password char(60) COLLATE utf8_czech_ci NOT NULL,
last_login datetime NOT NULL,
last_change datetime NOT NULL,
registered_by int(11) NOT NULL,
phone varchar(20) COLLATE utf8_czech_ci NOT NULL,
date_reg date NOT NULL,
reg_number varchar(15) COLLATE utf8_czech_ci NOT NULL,
specialist char(1) COLLATE utf8_czech_ci NOT NULL,
company_name varchar(60) COLLATE utf8_czech_ci NOT NULL,
user_reference int(10) NOT NULL,
note text COLLATE utf8_czech_ci NOT NULL,
birth_number varchar(15) COLLATE utf8_czech_ci NOT NULL,
degree varchar(20) COLLATE utf8_czech_ci NOT NULL,
city varchar(40) COLLATE utf8_czech_ci NOT NULL,
street varchar(40) COLLATE utf8_czech_ci NOT NULL,
number int(7) NOT NULL,
zip int(6) NOT NULL,
called varchar(1) COLLATE utf8_czech_ci NOT NULL DEFAULT ‚0‘,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

spiider
Člen | 162
+
0
-

Tak nikdo neporadi kde by mohl byt zakopanej pes?