• 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

Aruba Cloud - Virtual Private Server VPS
0 głosów
409 wizyt
pytanie zadane 13 marca 2018 w PHP 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 (30,460 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 (30,460 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 (30,460 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ź 246 wizyt
pytanie zadane 5 lutego 2019 w PHP przez Dr. Zawijas Użytkownik (610 p.)
0 głosów
3 odpowiedzi 671 wizyt
pytanie zadane 13 grudnia 2016 w PHP przez wanderer Gaduła (3,710 p.)
0 głosów
1 odpowiedź 263 wizyt
pytanie zadane 16 września 2019 w PHP przez michal_php Stary wyjadacz (13,700 p.)

93,279 zapytań

142,278 odpowiedzi

322,298 komentarzy

62,599 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...