Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][Symfony2]Dołączanie encji do zapytania
Forum PHP.pl > Forum > PHP > Frameworki
Sagnitor
Witam forumowiczów.
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':
  1. /**
  2.  * Details
  3.  *
  4.  * @ORM\Table(name="details")
  5.  * @ORM\Entity(repositoryClass="Graduates\CommunityBundle\Entity\DetailsRepository")
  6.  */
  7. class Details
  8. {
  9. /**
  10.   * @var integer
  11.   *
  12.   * @ORM\Column(name="id", type="integer", nullable=false)
  13.   * @ORM\Id
  14.   * @ORM\GeneratedValue(strategy="IDENTITY")
  15.   */
  16. private $id;
  17.  
  18. /**
  19.   * @var string
  20.   *
  21.   * @ORM\Column(name="content", type="string", length=255, nullable=true)
  22.   */
  23. private $content;
  24.  
  25. /**
  26.   * @var boolean
  27.   *
  28.   * @ORM\Column(name="visible", type="boolean", nullable=true)
  29.   */
  30. private $visible;
  31.  
  32. /**
  33.   * @var \Person
  34.   *
  35.   * @ORM\ManyToOne(targetEntity="Person")
  36.   * @ORM\JoinColumns({
  37.   * @ORM\JoinColumn(name="person_id", referencedColumnName="id")
  38.   * })
  39.   */
  40. private $person;
  41.  
  42. /**
  43.   * @var \Field
  44.   *
  45.   * @ORM\ManyToOne(targetEntity="Field")
  46.   * @ORM\JoinColumns({
  47.   * @ORM\JoinColumn(name="field_id", referencedColumnName="id")
  48.   * })
  49.   */
  50. private $field;


Encja 'Field':
  1. /**
  2.  * Field
  3.  *
  4.  * @ORM\Table(name="field")
  5.  * @ORM\Entity
  6.  */
  7. class Field
  8. {
  9. /**
  10.   * @var integer
  11.   *
  12.   * @ORM\Column(name="id", type="integer", nullable=false)
  13.   * @ORM\Id
  14.   * @ORM\GeneratedValue(strategy="IDENTITY")
  15.   */
  16. private $id;
  17.  
  18. /**
  19.   * @var string
  20.   *
  21.   * @ORM\Column(name="name", type="string", length=45, nullable=true)
  22.   */
  23. private $name;
  24.  
  25. /**
  26.   * @var string
  27.   *
  28.   * @ORM\Column(name="type", type="string", length=45, nullable=true)
  29.   */
  30. private $type;
  31.  
  32. /**
  33.   * @var string
  34.   *
  35.   * @ORM\Column(name="form_name", type="string", length=45, nullable=true)
  36.   */
  37. private $formName;


Zapytanie do bazy:
  1. <?php
  2. namespace Graduates\CommunityBundle\Entity;
  3.  
  4. use Doctrine\ORM\EntityRepository;
  5.  
  6. class DetailsRepository extends EntityRepository
  7. {
  8. public function findByPersonJoinedToField($person)
  9. {
  10. $query = $this->getEntityManager()
  11. ->createQueryBuilder()
  12. ->select(array('d', 'f'))
  13. ->from('GraduatesCommunityBundle:Details', 'd')
  14. ->leftJoin('GraduatesCommunityBundle:Field', 'f', 'WITH', 'd.field=f.id')
  15. ->where('d.person = :person')
  16. ->andWhere('d.visible=1')
  17. ->setParameter('person', $person)
  18. ->getQuery();
  19.  
  20. try {
  21. return $query->getResult();
  22. } catch (\Doctrine\ORM\NoResultException $e) {
  23. return null;
  24. }
  25. }
  26. }


oraz wyświetlanie w szablonie:
  1. {% for detail in details %}
  2. <h4>{{ detail.field.name }}:</h4>
  3. {{ detail.content }}
  4. {% 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.
ano
Masz jasno napisane - w obiekcie klasy "Field" nie masz atrybutu o nazwie "field". Prawdopodobnie się pomyliłeś i w kolekcji "details" masz tak na prawdę obiekty Field. Zrób var_dump i sam się przekonaj co tam siedzi tongue.gif
Sagnitor
Właśnie chodzi o to, że w tej kolekcji siedzą na przemiennie obiekty Details i Field. Tutaj leży szkopuł i nie wiem dlaczego tak się dzieje.
Sagnitor
Nie kopiowałem już do kodu encji getterów i setterów, które posiadam. Wiem o czym mówi błąd, chodzi o to, że to zapytanie które podałem w klasie Repository zamiast zwracać obiekty typu tylko Details zwraca [0] -> Details, [1] -> Field i tak dalej. Zna ktoś przyczynę takiego stanu rzeczy? Będę wdzięczny.
bylek
A spróbuj zamiast 2 obiektów wyciągnąć z zapytania tylko te pola które potrzebujesz(daj sobie alias field_name dla pola name z tej encji), wyświetl sobie później obiekt zwrócony przez zapytanie i zobacz czy field_name wyświetla się dobrze.

Edit:
I czemu zamiast użyć:
->leftJoin('d.field', 'f')
piszesz:
->leftJoin('GraduatesCommunityBundle:Field', 'f', 'WITH', 'd.field=f.id')

dzięki relacji załatwionej w encji nie musisz pisać jakimi polami łączą się te 2 tabele.
Sagnitor
Wielkie dzięki bylek za pomoc, temat do zamknięcia smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.