tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Při použití LEFT JOIN se mi vrací chybné ID záznamu

před 5 lety

joe
Člen | 250

Ahoj,

teď v krátkosti, narazil jsem na problém, že při dotazu

SELECT `photo`.*
FROM `photo`
LEFT JOIN user u ON u.`id` = `photo`.`user_id`

se mi při čtení z entit vracelo chybné id, pokud jsem zavolal:

echo $photo->id; // správné ID fotky
echo $photo->user->id; // vracelo ID fotky, ne ID uživatele

Teprve až pokud se dotaz změnil na (výběr něčeho z přijoinované tabulky)

SELECT `photo`.*, u.cokoli
FROM `photo`
LEFT JOIN user u ON u.`id` = `photo`.`user_id`

vracelo se správné ID, měl jsem někde problém nebo to je očekávané chování?

před 5 lety

castamir
Člen | 631

jak máš zadefinované entity? Máš nějakou replikovatelnou ukázku?

Editoval castamir (14. 7. 2014 8:36)

před 5 lety

joe
Člen | 250

Blíž jsem to prozkoumal a původně (když jsem psal příspěvek) jsem myslel, že problém je s takovým dotazem, který jsem posílal, ale není – chyba byla u mě a dotaz byl (výběr jen *)

SELECT *
FROM `photo`
LEFT JOIN user u ON u.`id` = `photo`.`user_id`

Potom se ID přebíjely. „Problém“ tedy je, že nemůžu nikdy vybírat žádné sloupce z navíc přijoinované tabulky, je to tak? A to z důvodu:

  1. Pokud by se později změnila struktura tabulek, se kterýma se v dotazu počítá a v některých by byly stejné názvy sloupců – byl by problém.
  2. Pokud je dotaz (vše by se mělo vybírat jen z tabulky pro entitu/repozitář, kde se SQL spouští)
SELECT `photo`.*
FROM `photo`
LEFT JOIN user u ON u.`id` = `photo`.`user_id`

a v kódu pak zavolám

$photo->id
$photo->user->id

Druhý řádek zapříčiní zavolání dalšího SQL dotazu (na výběr uživatelů), ačkoli data už bych mohl vybírat předchozím dotazem, je to tak?

3. Trochu vidím problém i ve využití filtrů, které mohou joinovat další tabulky…

Nebo jsem něco špatně pochopil? :) (včera to bylo asi už podruhé, co jsem přečetl kompletně celou dokumentaci na webu pro Lean Mapper a jsem z toho teď trochu moudřejší)

Editoval joe (19. 7. 2014 14:21)