Kdyby\Doctrine získání více hodnot z další tabulky

Rafan
Člen | 17
+
0
-

začal jsem s doctrine 2 (Kdyby\Doctrine) a nevím jak udělat následující věc:

mám tabulku products a k ní tabulku products_combos a chci docílit toho, že u výpisu produktů budu mít i výpis všech dostupných variant. Podařilo se mi to zprovoznit, ale pro každý produkt se mi dělá extra sql dotaz pro získání dostupných variant. Potřebuji aby mi doctrine složilo dotaz ve smyslu:

select * from products

a

select * from products_combos where product_id IN (...)

podobně jako např. NETTE Database.

Nebo můžete mi prosím vysvětlit jak se tato situace v Doctrine řeší?

<?php
class GetProductsQuery extends \Kdyby\Doctrine\QueryObject
{
	/**
	 * @var array|\Closure[]
	 */
	private $select = [];

	/**
	 * @param \Kdyby\Persistence\Queryable $repository
	 * @return \Doctrine\ORM\Query|\Doctrine\ORM\QueryBuilder
	 */
	protected function doCreateQuery(\Kdyby\Persistence\Queryable $repository)
	{
		$qb = $repository->createQueryBuilder()
	      ->select('p.name')->from(App\Model\Entity\Products::class, 'p');

		foreach ($this->select as $modifier) {
			$modifier($qb);
		}

	    return $qb;
	}

	public function withCategory()
	{
		$this->select[] = function (\Kdyby\Doctrine\QueryBuilder $qb) {
			$qb->addSelect('c.category_id');
			$qb->leftJoin(App\Model\Entity\Categories::class, 'c', 'WITH', 'c.product_id=p.id');
		};
		return $this;
	}

	public function withCombos()
	{

		$this->select[] = function (\Kdyby\Doctrine\QueryBuilder $qb) {

			//jak poskládat dotaz?

		};
		return $this;
	}

}
David Matějka
Moderator | 6445
+
+2
-
Rafan
Člen | 17
+
0
-

Ahoj, ano to bude ono :) Děkuji mnohokrát!

Rafan
Člen | 17
+
0
-

Ahoj, tak prosím ještě o jednu věc. SQL se mi již generuje v pořádku (mám tam krásně 2 dotazy, tak jak bych potřeboval, když si SQL hodím do phpMyAdmin, tak vrací data co potřebuji). Nicméně nedaří se mi vybrané položky správně vypsat, resp. jak se dostanu k datům které získává ta postFetch metoda?

V QueryBuilderu mám:

	/---
public function withAllCategories()
{
	$this->onPostFetch[] = function($_, \Kdyby\Persistence\Queryable $repository, \Iterator $iterator)
	{
		$ids = array_keys(iterator_to_array($iterator, TRUE));

	    $repository->createQueryBuilder()
	      ->select('partial products.{id}', 'categories')
	      ->from(App\Model\Entity\Products::class, 'products')
	      ->leftJoin('products.categories', 'categories')->addSelect('categories')
	      ->andWhere('products.id IN (:ids)')->setParameter('ids', $ids)
	      ->andWhere('categories.category_id IS NOT NULL')
	      ->getQuery()->getResult();
	 	};

	return $this;
}

A v ProductsFacade se snažím data získat, takže volám:

	$query = (new \GetProductsQuery())->orderById('DESC')->withAllCategories();
	$result = $this->repository->fetch($query);

foreach($result as $item)
{
		dump($item);
}

Dumpnutý item pak vypadá takto:

App\Model\Entity\Products #21f1
id private => 71
name => "Item 7" (6)
description => null
code => null
categories protected => Doctrine\ORM\PersistentCollection #d114

Akorát ta private categories je entita která se přidružila automaticky na základě nastavení entit. Pokud si vypíšu:

	echo $item->categories->getCategoryId()

tak se sice ID kategorií pro každý řádek vypíše, ale zase se provede X těch SQL dotazů.

Takže vlastně nevím, jak se dostanu přímo k těm datům co mi vrací ta post fetch metoda „withAllCategories“. Nikde jsem to bohužel nenašel.

Děkuji za pomoc.