LEFT OUTER JOIN – vi nekdo jak na to?

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

Nedari se mi spojit dve (a vice) tabulky pomoci LEFT OUTER JOIN – muze nekdo prosim poradit?

muj kod je:

$this->template->books = $this->books->select("book.id as bid, book.comment, book.category, book.standort, book.serie_seq, book.release_date, book.name as bname, author.name as aname, serie.name as sname")->where( array("book.name like ? or author.name like ? or serie.name like ?" => array("%$search_text%","%$search_text%","%$search_text%")) )->order("book.changed_date DESC ");

a ve vysledku dostanu inner join (detaily nize) – ted jen vedet jak ten kod zmenit aby byl pouzity left outer join? Vite nekdo jak na to?

SELECT book.id as bid, book.comment, book.category, book.standort, book.serie_seq,
book.release_date, book.name as bname, author.name as aname, serie.name as sname, 1
FROM [book]
INNER JOIN [author] ON [book].[author_id] = [author].[id]
INNER JOIN [serie] ON [book].[serie_id] = [serie].[id]
WHERE (book.name like ? or author.name like ? or serie.name like ?)
ORDER BY book.changed_date DESC
Jan Voráček
Člen | 90
+
0
-

S takto položeným dotazem toho bohužel nedosáhneš. Celý dotaz včetně JOINů se sestavuje v metodě getSql, kde se nejprve vytvoří INNER JOINy podle tabulek použitých v restrikci (pokud podmínka není IS NULL – pak se použije logicky LEFT JOIN) a až poté se přidají LEFT JOINy podle tabulek použitých v projekci a agregaci. Pokud tedy vyhodíš klauzuli WHERE (což je blbost a určitě to nechceš), změní se na spojení na vnější.

Dá se ale to obejít hackem:

->where( array("book.name like ? or author.name like ? or serie.name like ? or (serie.name is null and author.name is null and 1=2)" => array("%$search_text%","%$search_text%","%$search_text%")) )

Restrikci to nijak nezmění (OR FALSE), ale použijí se LEFT JOINy.

Jan Navratil
Člen | 9
+
0
-

Mockrat dekuji! Funguje perfektne!