yetorm – entitycollection left join do jiné tabulky

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

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
+
0
-

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)