Przemysław Godlewski

Przemysław Godlewski Own company/PHP
programmer/Web
Developer

Temat: 'where' w entities?

witam,

prosze o pomoc w następującej kwestii:

mam dwie tabele ponizej:

cms_pages
--------------------
- id
- menu_id
- parent_id
- ordered
- active

cms_pages_content
---------------------------
- id
- page_id (odnosi sie do 'id' wyzej)
- language_id
- keywords
- keydescription
- contents

Zbudowałem entities Page oraz PageContent i wszystko ładnie działa tylko ze jesli napiszę:

$pages = $em->getRepository('MyTestBundle:Page')->find(1);

ale:

a) PageContent (z tabeli cms_pages_content) odpowiadajacy wybranemu id=1 (z tabeli cms_pages) zawiera wpisy wszystkich wersji językowych, a chciałbym wybrac tylko jeden wpis wersji polskiej lub ang w zaleznosci od jakiejs zmiennej np $lang.

b) moge napisac zapytanie ponizej ktore wybierze mi strony z menu gornego (jednego):

$pages = $em->getRepository('MyTestBundle:Page')->findBy(
$where=array('menu_id'=>'1'), // menu id
$order=array('ordered'=>'DESC'), // order
$limit=0);

ale relacja 1:n, czyli obiekty PageContent wybranych rodziców Page będą zawierały wszystkie wpisy w tabeli cms_pages_content, a te pod-obiekty tez chciałbym zawęzić do wybranej wersji jezykowej.

Mam pomysł aby otworzyc sobie klasę Language i ustawić tam static $lang na poczatku wywolywania skryptów i przed odpaleniem powyzszego zapytania $pages,

ale nie wiem jak ograniczyc przy relacji 1:n zwracane rekordy w tabeli docelowej ustawiając którąś z jej kolumn na jakąś wartość..
Michał Strzelczyk

Michał Strzelczyk Software developer

Temat: 'where' w entities?

Chyba nie do końca zrozumiałem, ale postaram się chociaż trochę pomóc.

a) można wybierać wiersze po kilku polach tak: findBy(array('pageId' => $id, 'languageId' => $lang));

b) jak wyżej - wyszukujemy dodatkowo po polu języka

Nie do końca rozumiem co oznacza tutaj find(1) - wyszukuje on chyba obiekt po id, zakładając unikalność id dostaniemy jeden obiekt, czyli jedną wersję językową wpisu?

konto usunięte

Temat: 'where' w entities?

Jeśli dobrze zrozumiałem to potrzebujesz własnej metody w PageRepository która Ci zwróci te dane, dlatego że domyślnie skróty w Doctrine są dość proste (np. pozwalają na where, ale nie dodasz limitu [oprócz findOneBy] czy też sortowania).

DQL powinien mniej więcej wyglądać tak:

$query = $this->createQueryBuilder('p')
->select('p, c')
->leftJoin('p.content', 'c')
->where('p.menu_id = :id')
->andWhere('c.language_id = :lang')
->orderBy('p.ordered', 'desc')
->setParameter('id', $id)
->setParameter('lang', $lang)
->getQuery();

return $query->execute();
Przemysław Godlewski

Przemysław Godlewski Own company/PHP
programmer/Web
Developer

Temat: 'where' w entities?

jesli wykonam zapytanie:

$pages = $em->getRepository('MyTestBundle:Page')->find(1);

to w $pages->htmlContent bede mial wszystkie wpisy z tabeli cms_pages_content dla ktorych page_id=1

czyli wszystkie wersje jezykowe. A chce pobrac tylko aktualna wersje jezykową, a jezyk ustawie sobie w jakiejs zmiennej czy klasie zanim odpale pages..->find(1);

w klasie Page mam:

/**
*
* @ORM\OneToMany(targetEntity="PageContent", mappedBy="page_id", cascade={"all"})
* @ORM\OrderBy({"id"="ASC"})
*/
protected $htmlContents;

a w klasie PageContent mam:

/**
* @ORM\ManyToOne(targetEntity="Page", inversedBy="htmlContents")
* @ORM\JoinColumn(name="page_id", referencedColumnName="id")
*/
protected $page_id;

Zerkne na to co podał pan Józef. Dzieki.
Adam W.

Adam W. senior php
developer, Symfony

Temat: 'where' w entities?

Przemysław Godlewski:
jesli wykonam zapytanie:

$pages = $em->getRepository('MyTestBundle:Page')->find(1);

find służy do prostych pobrań rekordów.
w Twoim przypadku jest to bardziej złożone, bo dochodzą joiny.

Zerkne na to co podał pan Józef. Dzieki.

tak właśnie się to robi, za pomocą querybuildera tworzy swoje zapytanie, bardziej rozbudowane.
Krzysztof N.

Krzysztof N. CEO. Aplikacje
internetowe i
mobilne. Symfony,
Zend.

Temat: 'where' w entities?

Przemysław Godlewski:
ale nie wiem jak ograniczyc przy relacji 1:n zwracane rekordy w tabeli docelowej ustawiając którąś z jej kolumn na jakąś wartość..
Przemek, jak już zostało napisane (patrz: Józef i Adam), stwórz klasę Repository, którą powiążesz z klasą Entity. Następnie w tejże klasie Repository napisz metodę, która zwróci dane jakie potrzebujesz. Metoda ta powinna korzystać z QueryBuildera abyś mógł stworzyć sobie dowolnie skomplikowane zapytanie DQL.

Osobna kwestia jest taka, że możesz napisać klasę Repository, może abstrakcyjną, i w niej zawrzeć metody, które często piszesz / wykonujesz, ale to osobna kwestia i offtopic.

Następna dyskusja:

Slabe zwiazki (weak entitie...




Wyślij zaproszenie do