Nette\Database\Table „Invalid argument supplied for foreach()“

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

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)

_Martin_
Generous Backer | 679
+
0
-

Narazil jsem na stejnou chybu, přetrvává i v posledním dev. buildu.

hrach
Člen | 1834
+
0
-

Mas nightly verzi? Na toto je napsany validni test: https://github.com/…t%28%29.phpt#L58

_Martin_
Generous Backer | 679
+
0
-

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
hrach
Člen | 1834
+
0
-

Uved prosim priklad vztahu na testovaci db.

_Martin_
Generous Backer | 679
+
0
-

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.

hrach
Člen | 1834
+
0
-

Ano, složené klíče nejsou zatím podporovány.