Nette\Database\Table „Invalid argument supplied for foreach()“
- Elijen
- Člen | 171
Nette 2.0 beta
Při práci s ActiveRow vytvořeným pomocí metody insert se při pokusu
o získání záznamu z cizí tabulky
vyvolá WARNING: Invalid argument supplied for foreach().
DB:
SELECT * FROM user;
+-------+
|id|name|
+--+----+
| 1| joe|
+--+----+
SELECT * FROM order;
+--+-------+
|id|user_id|
+--+-------+
| 1| 1|
+--+-------+
Pokud získám objednávku standardní cestou, vše je v pořádku:
$order = $db->table('order')->find(1);
echo $order->user->name; // joe
Pokud ale objednávku vytvořím pomocí insertu:
$order = $db->table('order')->insert(array('id' => 2, 'user_id' => 1));
echo $order->user->name; // ***WARNING: Invalid argument supplied for foreach().***
dojde ke výše zmiňované chybě.
Očekávané chování: Měla by se načíst cizí tabulka a vrátit hodnotu sloupce name.
Editoval Elijen (11. 11. 2011 14:07)
- hrach
- Člen | 1838
Mas nightly verzi? Na toto je napsany validni test: https://github.com/…t%28%29.phpt#L58
- _Martin_
- Generous Backer | 679
Po bližším zkoumání zjišťuji, že jde o stejnou hlášku, nikoliv
příčinu. Rozdíl je v tom, že insert
provádím na selekci
(tabulce), kterou jsem získal jako related z jiného řádku.
$row = $connection->table('a');
$selection = $row->related('b');
$newRow = $selection->insert(array(...));
$newRow->sloupecek; // vyhodí onu výjimku
- _Martin_
- Generous Backer | 679
Tady to je. Ještě podotknu, že chyba je pouze u
DiscoveredReflection
.
Struktura databáze
CREATE TABLE `example_order` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `example_order_item` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`example_order_id` int(10) unsigned NOT NULL,
`price` mediumint(9) NOT NULL,
PRIMARY KEY (`id`,`example_order_id`),
KEY `example_order_id` (`example_order_id`),
CONSTRAINT FOREIGN KEY (`example_order_id`) REFERENCES `example_order` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `example_product` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`example_order_id` int(10) unsigned DEFAULT NULL,
`example_order_item_id` int(10) unsigned DEFAULT NULL,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `example_order_item_id` (`example_order_item_id`,`example_order_id`),
CONSTRAINT FOREIGN KEY (`example_order_item_id`, `example_order_id`) REFERENCES `example_order_item` (`id`, `example_order_id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Data: example_order
id | created |
---|---|
1 | 2012–01–26 21:05:32 |
Kód generující chybu
$items = $this->context->database->table('example_order')->get(1)->related('example_order_item');
$item = $items->insert(array(
'example_order_id' => 1,
'price' => 250,
));
// tady by k chybě taky došlo: $item->id
$products = $this->context->database->table('example_product');
$products->insert(array(
'example_order_id' => 1,
'example_order_item_id' => $item->id, // zde dojde k chybě
'name' => 'Test',
));
Hádám, že problém bude se složenými klíči.