Přistupování k cizímu klíči – bez explicitního SELECTu nevytáhne sloupec s cizím klíčem
- frosty22
- Člen | 373
Zdravím,
na žádost vytvářím nové vlákno s tímto problémem. Původní vlákno zde https://forum.nette.org/…-jak-pracuje.
Aktualizoval jsem v jednom projektu refaktorované Nette\Database (viz předchozí vlákno) a NDB začalo hlásit chybu při přístupu k jiné tabulce, jelikož si nevytáhl v SELECTu sloupec s cizím klíčem. Vyřešil jsem to explicitním napsáním sloupců do metody SELECT.
Vygenerovaný SQL dotaz:
SELECT `item`.*
FROM `item`
LEFT JOIN `web` ON `item`.`web_id` = `web`.`web_id`
INNER JOIN `type_discount` ON `item`.`type_discount_id` = `type_discount`.`type_discount_id`
WHERE (`item`.`state` = ?) AND (`web`.`removed` = ?) AND (`web`.`authorized` = ?) AND
(`type_discount`.`type_discount_id` IS NOT NULL) AND (`item`.`fixed_state` = ?)
PHP část:
<?php
$items = $this->connection->table("item")
->where("item.state = ?", 1)
->where("web.removed = ?", 0)
->where("web.authorized = ?", 2)
->where("item.fixed_state", 1);
// Zde ještě získávám počet $item->count() pro paginator, a následně předávám $items do šablony
?>
V šabloně:
{foreach $items->select("item.*") as $item}
{var $additional = $item->ref("type_discount")}
... zde není $additional, pokud nezavolám select("item.*")
{/foreach}
PS: Cache jsem samozřejmě vždy vymazal, čili zde problém není
Editoval frosty22 (7. 8. 2012 16:44)
- frosty22
- Člen | 373
Aj promiň, koukám že jsem to napsat docela blbě ;(
Takže $additional = FALSE, ale nyní jsem zjistil, že mi to dělá jenom prvně, tj. když smažu cache, tak mi to hodí $additional = FALSE a po refreshi již je to nadále OK.
A jedná se tedy o filtrovací query, čili když rozšířím dotaz např. o další where, tak se to stane prvně znovu.
A co se týče onoho dotazu, pokud ti to tedy pomůže, tak budu muset to nějak vypreparovat ze systému – tak to se tam tvoří dost dotazů a teď nevím, které s tím souvisí přímo a které ne. Ale na první pohled to vypadá, že to generuje stejné dotazy, leč tedy to asi není pravděpodobné. Ale pravděpodobně to souvisí s cachováním SELECTovaných sloupců.
Editoval frosty22 (9. 8. 2012 13:10)