Ambiguous joining column in related call

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

Dobrý den,
mám poněkud ošemetný problém a nevím si rady.
Potřebuji získat data ze tří tabulek, které spojuji joiny. Můj problém je, že data potřebu získat jako instanci Nette\Database\Table\Selection.
Funkční SQL dotaz je takovýto:

<?php
SELECT food_order.sloupec, order.id, printed_order.nejakySloupec FROM food_order
JOIN order ON order.order_id = order.id
JOIN printed_order ON order.id = printed_order.order_id
?>

Přepsal jsem to jako

<?php
 $this->connection
->table('food_order')
->select('food_order.sloupec, order.id, order:printed_order.nejakySloupec');
?>

Tento dotaz bohužel končí hláškou „Ambiguous joining column in related call“.
Nedokážu prostě přidat JOIN na tabulku „printed_order
Už si s tím nevím rady. Můžete mi prosím někdo poradit?

hrach
Člen | 1836
+
0
-

Hod sem pls minimalni definici tech tabulek.

ajda2
Člen | 66
+
0
-

Zjednodušená struktura tabulek je tato:

<?php
CREATE TABLE `food_order` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `order_id` int(10) unsigned NOT NULL,
  `date` date NOT NULL COMMENT 'Date of day'
  PRIMARY KEY (`id`),
  KEY `fk_food_order_order1_idx` (`order_id`),
  KEY `food_order_date_index` (`date`),
  CONSTRAINT `fk_food_order_order1` FOREIGN KEY (`order_id`) REFERENCES `order` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

CREATE TABLE `order` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

CREATE TABLE `printed_order` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `order_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `order_id` (`order_id`),
  CONSTRAINT `printed_order_ibfk_2` FOREIGN KEY (`order_id`) REFERENCES `order` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

?>

Ještě přemýšlím, že by bylo asi lepší začít dotaz na tabulce order a nejspíš by to fungovalo.

hrach
Člen | 1836
+
0
-

Mne to fugnuje v poradku. Jakou mas verzi nette? Nemas tam nahodou mezi tema tabulkama jeste nejaky cizi klic?

ajda2
Člen | 66
+
0
-

JJ, je tam ještě více klíčů, které se do toho pletly. Běží to na verzi 2.0.8.
Bohužel nakonec vyšlo najevo, že je koncepční chyba v databázi. Takže nakonec to budu řešit jinak a zjednoduší se dotazy. Takže už tento problém není nutné vyřešit.

Můžu mít, ale dotaz, jestli lze nějak explicitně v selectu uvádět, přes který sloupec se provede spojení s danou tabulkou? Případně jak ručně vybrat LEFT JOIN místo INNER JOIN apod? Vím, že lze napsat celý dotaz ručně, ale někdy je potřeba to nacpat do selectu např. kvůli použití DataGridu.

Nevíš prosímtě o nějaké dokumentacei Nette\Database? Našel jsem jednu prezentaci od Tebe, ze které jsem pochopil, jak se používají dvojtečky a konstruují složitější dotazy, ale nějaká komplexní dokumentace mi dost chybí…

PS: Víš že se v Chrome nedá dostat za pátý slide?
http://public.skrasek.com/…a_2012_04_28

Editoval ajda2 (15. 4. 2013 15:57)

hrach
Člen | 1836
+
0
-
  • dobře tak lidem, co pouzivaji chrom; je to sracka.
  • dokumentace neni a kdy bude tezko rict
  • dvojteckova notace ma chvilku novy vyznam!!! – nyni se pise pred, jak jsem rikal v prednasce, po roce se to poradilo imlementovat a prosadit do masteru
  • left join misto inner – zatim nejde, bud BC break jenom na left
  • pres kterou tabulkou provest backjoin – nejde a asi nepujde, snazil jsem se to resit v rfc ale zavrhl jsem to, jako korektnejsi reseni mi pripada upravit si reflexy, aby pro nejaky token (key) vracela korektni vazbu
  • ze se podarilo vyresit – to je dobre :)
David Matějka
Moderator | 6445
+
0
-

left join jde. pouziva se vzdy, kdyz je relace na tu tabulku pouzita 2×, pr.

$selection->where('author.name', 'foo');

pouzije inner join, ale

$selection->where('author.name', 'foo')
->select('author.name');

pouzije left (je v podstate jedno, kde je to pouzito, jestli v select, where..)