• 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

VPS Starter Arubacloud
0 głosów
348 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ź 194 wizyt
pytanie zadane 5 lutego 2019 w PHP przez Dr. Zawijas Użytkownik (610 p.)
0 głosów
3 odpowiedzi 382 wizyt
pytanie zadane 13 grudnia 2016 w PHP przez wanderer Gaduła (3,710 p.)
0 głosów
1 odpowiedź 172 wizyt
pytanie zadane 16 września 2019 w PHP przez michal_php Stary wyjadacz (13,700 p.)

92,453 zapytań

141,262 odpowiedzi

319,087 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...