Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][Doctrine] jak poprawnie definiować relacje w schema.yml
Forum PHP.pl > Forum > PHP > Frameworki
zniviash
Witam,
chciałem zapytać jak należy definiować relacje w schema.yml?
czy należy wszędzie definiować relacje, tzn, jeżeli 'Artykul' ma relacje do 'Autor' to należy również zadbać o odwrotną relację w pliku schema.yml?
plik schema u mnie wygląda następująco:

Kod
---
detect_relations: true
options:
  collate: utf8_polish_ci
  charset: utf8
  type: InnoDB
Artykul:
  tableName: artykul
  columns:
    idArtykul:
      primary: true
      type: integer(4)
      notnull: true
      autoincrement: true
    tytul:
      type: string(45)
    autorId:
      type: integer(4)
      notnull: true
  relations:
    Autor:
      local: autorId
      foreign: idAutor
      foreignAlias: artykuly
Autor:
  tableName: autor
  columns:
    idAutor:
      primary: true
      type: integer(4)
      notnull: true
      autoincrement: true
    nazwa:
      type: string(100)
    relation:
      Artykul:
        local: idAutor
        foreign: autorId


jak pobrać artykuły wraz z ich autorami? próbowałem podobnie jak w jobeet ale za każdym razem otrzymuję inny błąd,
ostatnie wypociny to:
plik: ArtykulTable.class.php
  1. public function getArticles(){
  2. $q = $this->createQuery('art')->leftJoin('art.artykuly au ON art.autorid = autor.idautor')->execute();
  3. return $q;
  4. }

Kod
500 | Internal Server Error | Doctrine_Table_Exception
Unknown relation alias artykuly


może ktoś polecić jakąś książkę? mam "symfony w przykładach" i "programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework"
ale obydwie opierają się o propel'a.
wiem że Polskich niema, ale to żaden problem, może być po angielsku.

poradziłem sobie już z joinem, ale pozostaje kwestia jak opisywać relacje i czy możecie polecić jakieś książki smile.gif
crafter
Witaj
Jeśli definiujesz relację jeden do wielu czyli autor może mieć jeden lub więcej artykułów to musisz w Autor odpowiednio to zdefiniować:
Kod
Autor:
  relations:
     Artykul:
        local: idAutor
        foreign: autorId
        type: many
a w Artykul
Artykul:
  relation:
    Autor:
       local: autorId
       foreign: idAutor
       type: one


Jeśli używasz doctrine wtedy wygenerujesz model który powiąże Autora z arykułami czyli jesli pobierzesz obiekt autora i zrobisz na nim metodę getArticle() wtedy pobierzesz wszystkie artykuly należące do tego autora. W skrócie wyglądałoby to tak:
  1. $autor = AutorTable::getInstance()->find(1); //zwraca obiekt autora o id=1
  2. $article = $autor->getArticle(); //zwraca kolekcje arykulow


Jeśli chcesz pobrać artykuły wraz z ich autorami w modelu robisz np tak:
Model - AutorTable:

  1. //metoda pobiera autora o jakims id
  2. public static function getAutor($id) {
  3. $q = Doctrine_Query::create()
  4. ->select('a.*')
  5. ->from('Autor a')
  6. ->where('a.idAutor = ?',$id);
  7. return $q->execute();
  8.  
  9. }


teraz w module jakiejs akcji robisz:
  1. $autor = AutorTable::getAutor(1);
  2. $autor->loadRelated('Artykul');

w ten sposób pobierzesz sobie obiekt autora a w nim obiekty jako kolekcje artykulow przypisanych dla tego autora.

Albo ostatni sposób to poprostu zapytanie w modelu z innerJoin i leftJoin

Pisałem z palca więc moga być literóki w kodzie albo błędy.
pozdraiwam




zniviash
dzięki za świetną odpowiedź.
rozpoczynam naukę symfony i na razie biegam trochę po omacku:] przy Zendzie było prościej biggrin.gif
a tutaj wszech ogarniające magiczne generatory.

ruszyłem z dokumentacją doctrine. bardzo pomogł fragment tłumaczący że to zapytania DQL i nie należy ich traktować jak SQL smile.gif

jeżeli znasz jakiegoś bloga o symfony proszę napisz, obecnie szukam wszelkich materiałów, przy zendzie tego było sporo, a w tym temacie jakośniemogę za dużo znaleźć ;/

pozdrawiam
bikerszymek
Jeśli zaczynasz z Symfony to dlaczego nie zacząłeś z najnowszą wersją?
zniviash
muszę się przestawić z Zenda na Symfony do nowej pracy.

wiem tylko że sf2 jest szybsze, czy jeszcze ma jakieś znaczące zalety?
nie mówię tutaj o aktualności i czasie wspierania produktów bo to sprawy oczywiste.
bikerszymek
nie mam czasu zeby sie na ten temat rozwodzic wiec: http://symfony.com/symfony-in-five-minutes

to Ci powinno rozjasnic sprawe
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.