Doctrine 2 překlad entity do více jazyků
- Rafan
- Člen | 17
Ahoj všem, zkouším používat Doctrine 2 a lámu si hlavu s překlady webu do více jazyků. Mám následující kód:
Pages
<?php
namespace App\Model\Entity;
use Doctrine\ORM\Mapping as ORM;
use Kdyby\Doctrine\Entities\Attributes\Identifier;
use Knp\DoctrineBehaviors\Model\Translatable\Translatable;
use Zenify\DoctrineBehaviors\Entities\Attributes\Translatable as ZenifyTranslatable;
/**
* @ORM\Entity
* @method PagesTranslation translate($lang='')
*/
class Pages
{
use Identifier;
use Translatable;
use ZenifyTranslatable;
/**
* @ORM\Column(type="integer", nullable=true)
* @var string
*/
protected $position;
/**
* @ORM\Column(type="integer", nullable=true)
* @var string
*/
protected $parent_id;
function getId()
{
return $this->id;
}
function getParentId()
{
return $this->parent_id;
}
}
PagesTranslation
<?php
namespace App\Model\Entity;
use Knp\DoctrineBehaviors\Model\Translatable\Translation;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="pages_translations")
*/
class PagesTranslation
{
use Translation;
/**
* @ORM\Column(type="string", nullable=true)
* @var string
*/
protected $title;
/**
* @ORM\Column(type="string", nullable=true)
* @var string
*/
protected $url;
/**
* @ORM\Column(type="string", nullable=true)
* @var string
*/
protected $content;
/**
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* @param string $name
*/
public function setName($name)
{
$this->name = $name;
}
}
Při výběru dat z databáze by se zdálo vše ok, nicméně můj nepřítel je opět nepřiměřený počet dotazů pro výběr všech položek do stromového menu. Pro každý řádek z PagesTranslation si doctrine sestavuje vlastní dotaz do db. Chtěl bych mít optimálně 2 dotazy pro výběr.
Kód pro získání záznamů:
$return = $this->em->createQueryBuilder()
->select('p')
->from('App\Model\Entity\Pages', 'p')
->innerJoin('p.translations', 't')
->getQuery()
->getResult();
Výsledek z laděnky zde: https://ibb.co/eX0eXy
Děkuji moc za pomoc.
- ZahorskyJan
- Člen | 59
V nekterych pripadech doctrine pomuze, kdyz v query builderu v do metody select, kde mas ted jen ‘p’ pridas jeste i ten alias z joinu a bude vedet, ze chces vsechny tyto data a zepta se jednim dotazem. Tzn. mohlo by pomoct tam dat ‘p, t’
- ZahorskyJan
- Člen | 59
Rad jsem pomohl. Jeste jsem zapomnel dodat duvod. Nedival jsem se do tech trait, ale s velkou pravdepodobnosti tam ty vazby budou mit nastaveny lazy pristup, aby se nesestavovaly na kazdy dotaz velke entity, protoze je to pomale. V tom pripade doctrine nacte jenom proxy, ktera nacte entitu slutecne z db az ve chvili pristupu. Kdyz chces a vis, ze s ni budes pracovat, tak ji staci uvest prave v tom selectu a on polozi optimalni dotaz. Muze tam toho byt kolik potrebujes, i pres vice joinu, kdyz to bude odpovidat vazbam definovanym u entit. Ono toti jde pripojit v query builderu i neco, co neni v entite definovane jako vazba. Pak je ten vysledek vraceny ale slozitejsi pole.