No reference found při mazání záznamu(ů)

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

Zdravím mám sql dotaz:

$this->context->createCategoryitem()->where(array('category_id'=>$idcat,'item_id'=>$id))->fetch()->delete();

Laděnka mi hodí hlášku:

PDOException
No reference found for $category_item->

Když to zkouším přímo přes query tak bez problémů

$this->context->dotaz->get_query('delete from category_item where category_id='.$idcat.' AND item_id='.$id);

Tabulka je innoDB. Má jen 2 uvedené sloupce a 2 cizí klíče. Cache jsem promazal několikrát … nepomáhá … máte nějakou radu ?

Grelek
Člen | 233
+
0
-

Nemám řešení problému, ale chci se zeptat, proč voláš ->fetch()->delete()? Zavolej ->delete('*') nebo do funkce delete() prostě zadej sloupce, které chceš smazat.

sejmor
Člen | 63
+
0
-

Máš řešení – funguje.

Já se v Nette Database teprve rozkoukávám a tohle jsem vyčetl v porovnání dotazů

Každopádně díky :-)

Grelek
Člen | 233
+
0
-

Začínám se zlepšovat, možná potřebuji více sebedůvěry =D.

Databáze & ORM v dokumentaci.

EDIT: Jak níže píše ViPEr*CZ*, v odkazu nic o delete() není. Zapomněl jsem, kde jsem o tom četl, ale určitě je dobré si to přečíst =).

Editoval Grelek (6. 8. 2012 23:08)

ViPEr*CZ*
Člen | 813
+
0
-

V tý dokumentaci nic o delete není :-)
Todle

$this->context->createCategoryitem()->where(array('category_id'=>$idcat,'item_id'=>$id))->fetch()->delete();

by mělo taky fungovat… jen pokud databáze v tom selectu vrátí více řádků, pak todle smaže jen ten první. Pokud se to dá bez fetch, tak to smaže celý výběr. Možná Vám to hází chybu, protože fetch() ne vždy vrací ukazatel na objekt ActiveRow, ale když nic nenajde je výsledek FALSE a pak samozřejmě volání delete bude chyba.

sejmor
Člen | 63
+
0
-

ViPErCZ napsal(a):

V tý dokumentaci nic o delete není :-)

Já měl na mysli to porovnání dotazů: tam je uvedeno pro klasické delete:

$id = 123;
$ndb->table("table")->where("column", $id)->fetch()->delete();

Todle

$this->context->createCategoryitem()->where(array('category_id'=>$idcat,'item_id'=>$id))->fetch()->delete();

by mělo taky fungovat… jen pokud databáze v tom selectu vrátí více řádků, pak todle smaže jen ten první. Pokud se to dá bez fetch, tak to smaže celý výběr. Možná Vám to hází chybu, protože fetch() ne vždy vrací ukazatel na objekt ActiveRow, ale když nic nenajde je výsledek FALSE a pak samozřejmě volání delete bude chyba.

Select (ten můj) by měl vracet jeden záznam. Každopádně jsem chtěl mazat vše co to vrátí takže ten fetch tam nemá co dělat a zmátlo mě to výše uvedené. Tam si to přes ten fetch pravděpodobně sychrují protože chtějí mazat jenom jedno id.

Děkuju za osvětlení :-)

Editoval sejmor (6. 8. 2012 22:56)

ViPEr*CZ*
Člen | 813
+
0
-

sejmor napsal(a):

Já měl na mysli to porovnání dotazů: tam je uvedeno pro klasické delete:

To nebylo taky na ten Váš odkaz. ;-) Každopádně na tom Vašem odkaze je DELETE bez LIMIT 1 nakonci, tak že ten relevantní řádek z Nette Database by měl být bez fetch. Každopádně fetch() Vám vrací objekt ActiveRow a ten má metodu delete. Tak že si myslím, že Vám ten fetch vracel právě hodnotu FALSE.