Doctrine a nárust SQL dotazů

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

Zdravím,
dneska jsem si řekl, že vyzkouším konečně Kdyby/Doctrine.

Udělal jsem si „Inzerci“, která má 2 tabulky: Inzerát (advertisement) a značka (Mark).

Z DB jsem si vytáhl, všechny záznamy z tabulky Inzerát a vypsal:

{block content}
	{foreach $advertisements as $advertisement}
		{$advertisement->getMark()->getName()}
	{/foreach}
{/block}

Zjistil jsem však, že pro každou iteraci se posílá jeden SQL dotaz na značku (mark).
Používal jsem zatím jen YetORM a ta to měla vyřešeno, takže se poslal jeden dotaz na inzeráty a druhý na značky.

Jak se to v Doctrine řeší? Věřím, že to má Doctrina ošetřeno a jen s tím špatně pracuju.

Presenter

		$this-template->advertisements = $this->advertisementRepository->findBy([]);

AdvertisementRepository

<?php

namespace App\Model;

use App\Model\Entity\Advertisement;
use Kdyby\Doctrine\EntityRepository;

class AdvertisementRepository extends EntityRepository
{}

Předem děkuju za rady

David Matějka
Moderator | 6445
+
0
-

pro „has one“ asociace v pripade, ze vis, ze ji budes vytahovat vzdy, tak muzes pouzit fetch="EAGER"

nebo si napis vlastni DQL..

automaticka optimalizace 1+n dotazu je v doctrine slozita z duvodu pritomnosti identity mapy.

Jiří Nápravník
Člen | 710
+
0
-

Podivej se na DQL dotazy, ty tohle resi. Prijoinujes si potrebne entity.

ondrej256
Člen | 186
+
0
-

Dík za rychlé odpovědi

Marek Bartoš
Nette Blogger | 1171
+
+1
-

Sice už je to starší příspěvek, ale mohlo by zaujmout toto. Konkrétně druhý bod. Joiny použiješ jen u oneToOne, jinak se tahá zbytečně moc dat a v případě orm to vede i k pracnému převádění na entity.