Nette\Database – Row does not contain primary id column data

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

Ahoj,
omlouvám se, ale dělám něco špatně a chtěl bych vás poprosit o radu.

Mám tabulku kde mám primární klíč ID a nějaké další sloupce. Chtěl bych udělat update všech řádků, kde jsou ty další sloupce nějakých hodnot. Skončím ale s hláškou „Row does not contain primary id column data“.

Nastíním to univerzálně tady:

$updated = $this->connection->table('table')
                        ->where('column1', $col1)
                        ->where('column2', 1)
                        ->where('table2.column1', $foreignValues)
                        ->update(
                        array(
                            'status' => 4,
                        )
                );

V update jako takovém ale problém asi není, protože stejnou hláškou končí i pokus o fetch dat. Cache je smazaná.

Díky moc, Jarda

vvoody
Člen | 910
+
0
-

Ta hláška nám tvrdí presný opak toho čo ty :) takže ťa poprosím o dump tej tabuľky.

JL
Člen | 24
+
0
-

Nevím proč jsem si myslel že texy! dump bude lepší :-)
SQL dump:
http://pastebin.com/F3cGhMLj

Editoval JL (16. 2. 2013 21:07)

vvoody
Člen | 910
+
0
-

sql dump :)

JL
Člen | 24
+
0
-

Pravděpodobně, resp. téměř jistě, mi tam zlobí ten dotaz do druhé tabulky.

Výstup v laděnce je:

UPDATE `tip` SET ? WHERE (`opportunity_id` = ?)
AND (`resolution_id` = ?)
AND (`opportunity_possible_result`.`possible_result_id` IN (?))

tedy úplně chybí JOIN, nevím, momentálně jsem už zmatený, jdu to ještě jednou projít.

Zhruba (ve výsledku chci update) takovýto dotaz je cílem:

$this->connection->query('
                    SELECT (tip.id) FROM tip
                        JOIN opportunity_possible_result AS opr
							ON (opr.id = tip.opportunity_possible_result_id)
                    WHERE tip.opportunity_id = ?
                        AND resolution_id = ?
                        AND opr.possible_result_id = ?', 11, 1, 8)

Mám pocit jestli není problém v ambigous opportunity_id, protože to je v této i v odkazované tabulce.

Díky.

Editoval JL (16. 2. 2013 21:43)

vvoody
Člen | 910
+
0
-

Ukáže presný kód ktorý robí problém a dump všetkých tabuliek, najlepšie aj ladenku.

enumag
Člen | 2118
+
-1
-

V update dotazu těžko můžeš mít joiny. Máš v podstatě dvě možnosti:

  1. místo joinu použít vnořený SELECT v klauzuli WHERE.
  2. Vybrat pomocí selection s joinem a fetchPairs jen IDčka a pak si vytvořit druhé selection kde do where dáš právě tato IDčka, na tom už update půjde.
JL
Člen | 24
+
0
-

@vvoody:
Zlobí mi už tohle:

$this->connection->table('tip')
                        ->where('opportunity_id', 11)
                        ->where('resolution_id', 1)
                        ->where('opportunity_possible_result.possible_result_id', 8)
                        ->fetch();

takže na základě toho si teď myslím, že je problém v tom že mám sloupec opportunity_id v tabulce tip i v tabulce opportunity_possible_result akorát že k téhle teorii mi nesedí chybová hláška

@enumag:
Že v update nemůžu mít joiny vím, spíš jsem to špatně formuloval. Neprojde mi právě ani selection, takže jsem to myslel tak, že přidat volání update už na to nemá vliv.

EDIT: Ne, tak jsem to skutečně myslel špatně a na dva dotazy to musím rozdělit tak jak psal @enumag, nicméně ta úplně hlavní chyba byla v tom, že jsem si asi špatně fetchoval data do té podmínky where co odkazovala do propojené tabulky. Až to prověřím tak to tu potvrdím a nevím jestli pak nesmazat celé tema aby moje blbost zbytečně nemátla ostatní. ANO, BYLO TO TAK, stačilo do where dát místo již provedeného fethPairs reprezentaci tabulky ošezanou pomocí where.

Děkuju a moc se omlouvám všem co se mnou ztráceli svůj čas.

Editoval JL (17. 2. 2013 1:41)