Problem mój, dość trywialny, okazał się być mi chwilowo nierozwiązywalny. Liczę na waszą pomoc. Do rzeczy: posiadam dwie encje 'Details' oraz 'Field' w relacji many to one. W widoku chcę wyświetlać po kolei encję 'Details' odwołując się do pola 'name' z 'Field'. Aby ilość zapytań nie rosła wraz z ilością rekordów postanowiłem zrobić JOIN'.a W tym momencie przy wyświetlaniu szablonu wyrzuca mi błąd, że odwołuję się do nieistniejącej metody encji Field (pomimo że pobieram Details w tablicy układają sie one obok siebie). Po tym niejasnym opisie przedstawię kod:
Encja 'Details':
/** * Details * * @ORM\Table(name="details") * @ORM\Entity(repositoryClass="Graduates\CommunityBundle\Entity\DetailsRepository") */ class Details { /** * @var integer * * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @var string * * @ORM\Column(name="content", type="string", length=255, nullable=true) */ private $content; /** * @var boolean * * @ORM\Column(name="visible", type="boolean", nullable=true) */ private $visible; /** * @var \Person * * @ORM\ManyToOne(targetEntity="Person") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="person_id", referencedColumnName="id") * }) */ private $person; /** * @var \Field * * @ORM\ManyToOne(targetEntity="Field") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="field_id", referencedColumnName="id") * }) */ private $field;
Encja 'Field':
/** * Field * * @ORM\Table(name="field") * @ORM\Entity */ class Field { /** * @var integer * * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @var string * * @ORM\Column(name="name", type="string", length=45, nullable=true) */ private $name; /** * @var string * * @ORM\Column(name="type", type="string", length=45, nullable=true) */ private $type; /** * @var string * * @ORM\Column(name="form_name", type="string", length=45, nullable=true) */ private $formName;
Zapytanie do bazy:
<?php namespace Graduates\CommunityBundle\Entity; use Doctrine\ORM\EntityRepository; class DetailsRepository extends EntityRepository { public function findByPersonJoinedToField($person) { $query = $this->getEntityManager() ->createQueryBuilder() ->from('GraduatesCommunityBundle:Details', 'd') ->leftJoin('GraduatesCommunityBundle:Field', 'f', 'WITH', 'd.field=f.id') ->where('d.person = :person') ->andWhere('d.visible=1') ->setParameter('person', $person) ->getQuery(); try { return $query->getResult(); } catch (\Doctrine\ORM\NoResultException $e) { return null; } } }
oraz wyświetlanie w szablonie:
{% for detail in details %} {{ detail.content }} {% endfor %}
Treść błędu: Method "field" for object "Proxies\__CG__\Graduates\CommunityBundle\Entity\Field" does not exist in GraduatesCommunityBundle:Person:profile.html.twig.
Z góry dziękuję za zainteresowanie się tematem.