• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyciąganie danych z powiązanych encji - Symfony3, Doctrine

0 głosów
102 wizyt
pytanie zadane 13 marca 2018 w PHP, Symfony, Zend przez MiguelSantos Początkujący (270 p.)

W ramach nauki próbuję zrobić dziennik elektroniczny ucznia, dane uczniów trzymam w osobnej tabeli, dane klasy w osobnej, a powiązanie ucznia z klasą w jeszcze kolejnej która wygląda tak:

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Uczen_klasa
 *
 * @ORM\Table(name="uczen_klasa")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\Uczen_klasaRepository")
 */
class Uczen_klasa
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Uczen")
     * @ORM\JoinColumn(name="uczen_id", referencedColumnName="id")
     */
    private $uczen;
    
    /**
     * @ORM\ManyToOne(targetEntity="Klasy")
     * @ORM\JoinColumn(name="klasy_id", referencedColumnName="id")
     */
    private $klasy;
    
    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set uczen
     *
     * @param \AppBundle\Entity\Uczen $uczen
     *
     * @return Uczen_klasa
     */
    public function setUczen(\AppBundle\Entity\Uczen $uczen = null)
    {
        $this->uczen = $uczen;

        return $this;
    }

    /**
     * Get uczen
     *
     * @return \AppBundle\Entity\Uczen
     */
    public function getUczen()
    {
        return $this->uczen;
    }

    /**
     * Set klasy
     *
     * @param \AppBundle\Entity\Klasy $klasy
     *
     * @return Uczen_klasa
     */
    public function setKlasy(\AppBundle\Entity\Klasy $klasy = null)
    {
        $this->klasy = $klasy;

        return $this;
    }

    /**
     * Get klasy
     *
     * @return \AppBundle\Entity\Klasy
     */
    public function getKlasy()
    {
        return $this->klasy;
    }
}

Teraz chciałbym wyciągnąć wszystkie dane z tej tabeli tzn dane odnośnie uczniów wraz z klasą do jakiej są przypisani, próbuję to robić na wzór: How to Work with Doctrine Associations / Relations - Fetching Related Objects ale nie bardzo mi się to udaje. Jak powinienem się do tego zabrać, czy problemem są źle ustawione relacje?

1 odpowiedź

0 głosów
odpowiedź 13 marca 2018 przez Assasz Nałogowiec (29,010 p.)
Trochę dziwna relacja, bo wynika z niej, że jeden uczeń może należeć do wielu klas. Zrobiłbym raczej relację jeden do wielu. Wtedy encja Uczeń powinna mieć własność klasa, do której otrzymujesz dostęp poprzez getter getClass(). Jak potem będziesz chciał powiedzmy dostać ID powiązanej klasy to piszesz getClass()->getId(), gdzie getId() jest getterem encji Klasa.
komentarz 14 marca 2018 przez MiguelSantos Początkujący (270 p.)
Cały czas nie mogę ogarnąć - jeżeli mam 3 encje: Uczen - Klasa - Uczen_klasa to powinienem ustawić własność $klasa w encji Uczen i poprzez getera $klasa odwoływać się do danych z encji Klasa?

Bo ja bym chciał odwoływać się do danych z tabeli Uczen i Klasa poprzez tę 3 encje która je łączy czyli Uczen_klasa, w niej ustawić atrybuty $klasa i $uczen i sposób relacji między nimi
komentarz 14 marca 2018 przez Assasz Nałogowiec (29,010 p.)
Ale ta trzecia encja Uczeń_klasa jest zbędna - takie encje pośredniczące stosuje się do relacji wiele do wielu, podczas gdy tutaj mamy do czynienia z relacją jeden do wielu. Tak jak napisałem, dodaj do encji Uczeń własność klasa (związaną relacją n-1 z encją Klasa) z getterem getClass(), za pomocą którego będziesz miał dostęp do powiązanej z uczniem klasy.

A tak poza tym polecam stosować nazewnictwo angielskie.
komentarz 15 marca 2018 przez MiguelSantos Początkujący (270 p.)
Dobrze, tak zrobię. Ale mam jeszcze pytanie, jeśli chodzi  np. o nauczycieli i klasy albo o przedmioty i nauczycieli to też ich powiązania chciałem trzymać w osobnych tabelach, powinienem się tego trzymać czy też bezpośrednio z tabeli Nauczyciel robić powiązanie z Klasa? Właściwie to jest chyba relacja wielu do wielu więc utworzenie takiej encji będzie w porządku?

Co do angielskiego nazewnictwa oczywiście się zgadzam i też to pozmieniam żeby nie wyrabiać złych nawyków.
komentarz 15 marca 2018 przez Assasz Nałogowiec (29,010 p.)
edycja 15 marca 2018 przez Assasz

Ja to widzę w skrócie tak:

Uczeń n-1 Klasa n-n Nauczyciel oraz Klasa / Nauczyciel n-n Przedmiot (w zależności, czy przedmioty mają być przypisane do klasy, czy do nauczyciela).

Przy relacji wiele do wielu (czyli n-n) robisz encję pośredniczącą.

Potem powiedzmy, że chcesz dostać nazwiska wszystkich nauczycieli przypisanych do klasy mając obiekt encji Uczeń:

# pobranie tablicy wszystkich powiązanych nauczycieli
$teachers = $student->getClass()->getTeachers()->toArray();

# inicjalizacja tablicy z nazwiskami nauczycieli
$teachersSurname = [];

# dodanie nazwiska każdego nauczyciela z tablicy do nowej tablicy z nazwiskami
foreach($teachers as $teacher){
    $teachersSurname[] = $teacher->getSurname();
}

 

komentarz 19 marca 2018 przez MiguelSantos Początkujący (270 p.)
Dzięki wielkie za czas i uwagę!

Podobne pytania

0 głosów
1 odpowiedź 52 wizyt
0 głosów
3 odpowiedzi 130 wizyt
pytanie zadane 13 grudnia 2016 w PHP, Symfony, Zend przez wanderer Gaduła (3,610 p.)
+1 głos
1 odpowiedź 84 wizyt
pytanie zadane 10 października 2016 w PHP, Symfony, Zend przez Bartłomiej Mirek Bywalec (2,310 p.)
Porady nie od parady
Zadając pytanie postaraj się o poprawną pisownię i czytelne formatowanie tekstu.Kompozycja

64,845 zapytań

111,307 odpowiedzi

234,116 komentarzy

46,718 pasjonatów

Przeglądających: 175
Pasjonatów: 5 Gości: 170

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...