Problem s clone ActiveRow

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

mam kod:

<?php
$row = $this->selection->find($id);
$rowTemp = clone $row;

$row->// to sa vytahuju nejake zavislosti a potom sa to foreach-uje
$rowTamp->//chcem vytiahnut dalsie zavislosti ALE tu to uz zostavy zle query
?>

ked ten kod upravim takto:

<?php
$row = $this->selection->find($id);
$rowTemp = $this->selection->find($id);

$row->// to sa vytahuju nejake zavislosti a potom sa to foreach-uje
$rowTamp->//funguje spravne
?>

tak je setko OK!
je tam nejaky bug? alebo je to naschval? ci len robim nieco zle ?

David Ďurika
Člen | 328
+
0
-

riesil uz niekto takyto problem?

enumag
Člen | 2118
+
0
-

Zřejmě ne… k čemu taky klonovat ActiveRow? ;-)

David Matějka
Moderator | 6445
+
0
-

asi je tam zavislost na puvodnim selection, schvalne zkus tohle:

<?php
$row = $this->selection->find($id);
$rowTemp = clone $row;
$rowTemp->setTable(clone $row->getTable());
?>
David Ďurika
Člen | 328
+
0
-

@matej21 mal si pravdu, funguje to tak ako pises
@enumag hore pisem ze preco potrebujem kolonovat…

enumag
Člen | 2118
+
0
-

@achtan: Stejně ti nějak nerozumím. Co je špatného na tomhle?

$row = $this->selection->find($id);
$rowTemp = $row;

Těmi závislostmi myslíš co? Volání related a pak ještě where?

Editoval enumag (17. 11. 2012 9:36)

David Ďurika
Člen | 328
+
0
-

sam nechapem, tiez som cakal ze to pojde ale ked spravim nieco taketo:

<?php
$row = $this->selection->find($id);
$rowTemp = $row;

$row->// to sa vytahuju nejake zavislosti a potom sa to foreach-uje
$rowTamp->//chcem vytiahnut dalsie zavislosti ALE tu to uz zostavy zle query
?>
enumag
Člen | 2118
+
0
-

Bohužel nechápu. :-( Co myslíš těmi závislostmi? Můžeš konkrétněji ukázat co nad tím $row respektive $rowTemp voláš a jaký dotaz je špatně?

David Ďurika
Člen | 328
+
0
-
<?php
$restaurant = $this->restaurants->find($id);
$foodsList = $restaurant->related('food')->fetchPairs('id', 'name');
$menuCard = $restaurant->related('menu_card')->where('date > ?', 0);

foreach($menuCard as $value) {
	$value->food->name; // tuto do hody chybu
}
?>

v premennej $foodsList a $menuCard su data OK len uz ked zacnem foreachovat $menuCard a v nom sa cez vstah pitat na dalsiu tabulku (food) a potom na stlpec (name) tak to hodi error. ALE nie pri prvej iteracii ta este zbehne OK, ale az na dalsej! lebo tam sa vykona query

<?php
SELECT `id`, `name` FROM `food` WHERE (`id` IN (5))
?>

cize ak mam v premennej $value->food_id = 5 tak po zavolani $value->food sa dostane pekne na tu dalsiu tabulku s jedlamy, ale ked je $value->food_id = 6 tak po zavolani $value->food dostanem NULL a nie activeRow ako predtym, kedze to spravilo zle SQL-ko…

ALE ked si tu premennu $restaurant vytahnem nanovo tak to ide ok!

<?php
$restaurant = $this->restaurants->find($id);
$foodsList = $restaurant->related('food')->fetchPairs('id', 'name');
$restaurant = $this->restaurants->find($id);
$menuCard = $restaurant->related('menu_card')->where('date > ?', 0);
...
?>

Editoval achtan (17. 11. 2012 12:56)

enumag
Člen | 2118
+
0
-

Aha, chápu. Tohle ale asi těžko někdo opraví aniž by tu chybu reprodukoval u sebe a důkladně otestoval. Leda @hrach by to možná dokázal.

Dej to jako issue na GitHub. S klonováním to nijak nesouvisí, to vůbec nezmiňuj. Bylo by dobré přidat SQL relevantních tabulek (ideálně test nebo sandbox se simulací tohoto problému).

David Ďurika
Člen | 328
+
0
-

SQL

CREATE TABLE `food` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `restaurant_id` int(11) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `restaurant_id` (`restaurant_id`),
  CONSTRAINT `food_ibfk_1` FOREIGN KEY (`restaurant_id`) REFERENCES `restaurant` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `food` (`id`, `name`, `restaurant_id`)
VALUES
	(5,'Kura',1),
	(6,'Prasa',1);


CREATE TABLE `menu_card` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `restaurant_id` int(11) unsigned DEFAULT NULL,
  `food_id` int(11) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `restaurant_id` (`restaurant_id`),
  KEY `food_id` (`food_id`),
  CONSTRAINT `menu_card_ibfk_1` FOREIGN KEY (`restaurant_id`) REFERENCES `restaurant` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `menu_card_ibfk_2` FOREIGN KEY (`food_id`) REFERENCES `food` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `menu_card` (`id`, `restaurant_id`, `food_id`)
VALUES
	(43,1,5),
	(44,1,6),
	(45,1,6),
	(46,1,5),
	(47,1,5),
	(48,1,6);

CREATE TABLE `restaurant` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `restaurant` (`id`, `name`)
VALUES
	(1,'FastVega');

a tu je kod pri kt. to hodi chybu

$restaurant = $this->getService('database')->table('restaurant')->where('id', 1)->fetch();
$menuCards = $restaurant->related('menu_card')->limit(1);
foreach ($menuCards as $row) {
	Debugger::barDump($row->food);
	Debugger::barDump($row->food->name);
}
$menuCards = $restaurant->related('menu_card')->limit(2);
foreach ($menuCards as $row) {
	Debugger::barDump($row->food);
	Debugger::barDump($row->food->name);
}
enumag
Člen | 2118
+
0
-

Great! THX @hrach! :-)

hrach
Člen | 1838
+
0
-

je trochu trapny, ze ten jednoradkovy fix jsem resil hodinu (bez testu) :D

enumag
Člen | 2118
+
0
-

Tak už to v případě NDB bývá, její „debugovatelnost“ mi připadá docela mizerná. S tím se asi nic dělat nedá, že?

hrach
Člen | 1838
+
0
-

Možná dá, ale já moc nevím jak… :)