Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony2][inny][SF2]Pobieranie z bazy tablicy z obiektami - jak?
Forum PHP.pl > Forum > PHP > Frameworki
michau85
Witajcie. Mam dwie tabele - "Product" i "Category" połączone relacją jeden do wielu. Chciałbym wyświetlić listę wszystkich produktów i powiązanych z nimi kategorii. Nie mam problemu z jednym obiektem. Pobieram go w kontrolerze i wyświetlam w widoku tak jak niżej:

  1. /// Kontroler
  2. $product=$this->getDoctrine()->getRepository('EmBundle:Product')->findOneById($id);
  3. return $this->render('EmBundle:Default:lista.html.twig',array('product'=>$product))

  1. /// Widok
  2. Nazwa produktu {{product.name}}
  3. Kategoria produktu {{product.category.name}}


Problem pojawia się gdy w kontrolerze zastosuje:

  1. /// Kontroler
  2. $products=$this->getDoctrine()->getRepository('EmBundle:Product')->findAll();
  3. return $this->render('EmBundle:Default:lista.html.twig',array('products'=>$products))


Wtedy w widoku mam:
  1. /// Widok
  2.  
  3. {% for p in products%}
  4. <p>{{ p.name }} {{ p.category.name}}</p>
  5. {% endfor %}


I tutaj pojawia się błąd mówiący o tym że array nie posiada pola category.name Krótko mówiąc - Jak wyświetlić listę wszystkich produktów i przypisanych kategorii w widoku? Proszę o pomoc.







404
Zrobiłeś relacją dwukierunkową?
michau85
Tak.
404
Hmmm, napisałeś, że Product i Category są połączone relacją jeden do wielu, czyli jeden produkt może mieć wiele kategorii, czyli musiałbyś zrobić coś takiego:
Kod
{% for p in products%}
    <p>{{ p.name }}</p>
    <ul>
        {% for c in p.categories %}
            <li>{{ c.name }}</li>
        {% endfor %}
    </ul>
{% endfor %}
Jeżeli powyższy kod nie zadziała to pokaż Product.orm.yml.
michau85
ŹLE się wyraziłem. Produkt może mieć tylko jedną kategorię, a jedna kategoria może być przypisana do wielu produktów.
prz3kus
wklej klasy entity tabelek
michau85
Problem rozwiązałem używając DQL:
  1. ///Kontroler
  2. $m=$this->getDoctrine()->getManager();
  3. $query=$m->createQuery('SELECT p FROM EmBundle:Product p JOIN p.category c');
  4. $products=$query->getResult();
  5. return $this->render('EmBundle:Bot:uczniowie.html.twig',array('products'=>$products));
  6.  


  1. ///Widok
  2. {% for p in products%}
  3. <p>
  4. {{p.name}} {{p.category.name}}
  5. </p>
  6. {% endfor %}


Załączam również Encje

  1. ///Product
  2. class Product
  3. {
  4. /**
  5.   * @var int
  6.   *
  7.   * @ORM\Column(name="id", type="integer")
  8.   * @ORM\Id
  9.   * @ORM\GeneratedValue(strategy="AUTO")
  10.   */
  11. private $id;
  12.  
  13. /**
  14.   * @var string
  15.   *
  16.   * @ORM\Column(name="name", type="string", length=255)
  17.   */
  18. private $name;
  19.  
  20. /**
  21.   * @ORM\ManyToOne(targetEntity="Category", inversedBy="products",cascade={"persist"})
  22.   * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
  23.   */
  24. protected $category;


  1. ///Category
  2. class Category
  3. {
  4. /**
  5.   * @var int
  6.   *
  7.   * @ORM\Column(name="id", type="integer")
  8.   * @ORM\Id
  9.   * @ORM\GeneratedValue(strategy="AUTO")
  10.   */
  11. private $id;
  12.  
  13. /**
  14.   * @var string
  15.   *
  16.   * @ORM\Column(name="name", type="string", length=255)
  17.   */
  18. private $name;
  19.  
  20. /**
  21.   * @ORM\OneToMany(targetEntity="Product", mappedBy="category",cascade={"persist"})
  22.   */
  23. protected $products;
  24.  
  25. public function __construct()
  26. {
  27. $this->products = new ArrayCollection();
  28. }
  29.  


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.