Doctrine 2 překlad entity do více jazyků

Rafan
Člen | 17
+
0
-

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 | 55
+
+2
-

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’

Rafan
Člen | 17
+
0
-

Tak to mě opravdu nenapadlo.. Zkoušel jsem všechno možné, ale na select jsem vůbec nekoukal a samozřejmě to funguje bezvadně.
Děkuji moc už druhý den se s tím peru a nakonec to vyřeší 2 znaky…

ZahorskyJan
Člen | 55
+
0
-

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.

Rafan
Člen | 17
+
0
-

To je super, moc Ti děkuji za objasnění hodně jsi mi pomohl.