yetorm – entitycollection left join do jiné tabulky
- Томас
- Člen | 85
Dobrý den,
používám YetORM a zasekl jsem se na jednom problému.
Mám tabulku M:N tzn.
`
php
category |
id, name, lft, rgt |
products |
id, name |
product_x_category |
id, ctg_id, p_id |
`
a potřeboval bych dostat všechny produkty z dané kategorie – což mám hotové v entitě
public function getProducts()
{
$selection = $this->toRecord()
->related(Table::PRODUCT_X_CATEGORY, "category_id")
->where("product_id.price != ? AND product_id.visibility = ?", 0, self::VISIBILITY_ON);
return new EntityCollection(
$selection, ProductEntity::class,
Table::PRODUCTS, "product_id");
}
Což funguje absolutně perfektně – vrátí mi to všechny produkty v kategorii s tím, že price != 0 a visibility = 1…
Ale co já bych potřeboval je, aby se mi vrátili i produkty, které jsou v sub kategoriích (tzn. tato kategorie je parent pro jiné kategorie co mají v sobě produkty)
Jak jste si asi všimli používám nested set model – kategorie kterou mám mají parametr LFT a RGT a její sub kategorie jsou v tomto rozmezí tzn
hlavní kategorie : lft – 1, rgt – 4
subka bude tedy lft 2, rgt 3
Jak tedy lze dosáhnout dotazu, který by mi vrátil produkty i z jiných kategorií podle této podmínky? Zkoušel jsem upravit dotaz na :
public function getProducts()
{
$selection = $this->toRecord()
->related(Table::PRODUCT_X_CATEGORY, "category_id")
->where("product_id.price != ? AND product_id.visibility = ? AND category_id.lft >= ? AND category_id.rgt <= ?", 0, self::VISIBILITY_ON, $this->lft, $this->rgt);
return new EntityCollection(
$selection, ProductEntity::class,
Table::PRODUCTS, "product_id");
}
ale to vygenerovalo takovýto dotaz – bez výsledků
SELECT COUNT(*), `product_x_category`.`ctg_id`
FROM `product_x_category`
LEFT JOIN `products` `product_id` ON `product_x_category`.`product_id`
= `product_id`.`id`
LEFT JOIN `category` `category_id` ON
`product_x_category`.`category_id` = `category_id`.`id`
WHERE (`product_x_category`.`category_id` IN (1)) AND (`product_id`.`price` != 0 AND
`product_id`.`visibility` = 1 AND `category_id`.`lft` >= 1 AND `category_id`.`rgt` <= 6)
GROUP BY `product_x_category`.`category_id`
Díky za Vaše odpovědi!
Editoval Томас (6. 4. 2016 18:59)
- Pechy.cz
- Bronze Partner | 21
Problém je zde
Томас napsal(a):
$selection = $this->toRecord() ->related(Table::PRODUCT_X_CATEGORY, "category_id")
Selection totiž již obsahuje
WHERE (`product_x_category`.`category_id` IN (1))
Je potřeba si na to založit čistý selection bez relace. Tzn. tahat data přímo z Table::PRODUCT_X_CATEGORY, nebo resp. lépe přímo z products.
$db->table("products")->where("price != ? AND visibility = ? AND :product_x_category.category.lft >= ? AND :product_x_category.category.rgt <= ?", 0, self::VISIBILITY_ON, $lft, $rgt);
Editoval Pechy.cz (2. 6. 2016 9:09)