Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [CakePHP] relacja hasMany
Forum PHP.pl > Forum > PHP > Frameworki
nospor
Hejka, mam trzy tabele:

users: id, nick, blabla
messages: id, content, blabla
message_users: message_id, user_id

Czyli do jednej wiadomosci może byc przypisanych wielu odbiorców

Na każdą tabele mam rzecz jasna model.
  1. class Message ....{
  2.  
  3.  
  4. public $hasMany = array(
  5. 'MessageUser' => array(
  6. 'className' => 'MessageUser',
  7. 'foreignKey' => 'message_id',
  8. 'dependent' => true,
  9. 'child' => true,
  10. ),
  11. );

oraz
  1. class MessageUser ... {
  2. public $belongsTo = array(
  3. 'Message' => array(
  4. 'className' => 'Message',
  5. 'foreignKey' => 'message_id',
  6. ),
  7. 'User' => array(
  8. 'className' => 'User',
  9. 'foreignKey' => 'user_id',
  10. )
  11. );
  12.  
  13.  
  14. }

No i na modelu Message robie findAll. Niesety ta metoda robi mi dwa zapytania.
Jedno na SELECT z messages, a drugie ne SELECT z message_users i potem łączy wyniki.
Czy można tu jakoś wymusić, by ona zrobiła mi jedno zapytanie:
Select ... from message left join message_users .... ?


edit: na chwilę obecną rozwiązałem to przez recznie dodanie LEFT JOIN dla findAll
kicaj
Patrząc na twoje tabele, to raczej jest relacja HABTM...
nospor
Tak, też do tego doszedłem. Nie mniej jednak nadal przy HABTM nie pobiera mi danych jednym zapytaniem tylko kilkoma.
kicaj
Pokaż kod którym pobierasz dane (np. metodę find)
nospor
$data = $this->find('all', $options);
gdzie w options są warunki, contains itp.

Probowalem już z paroma osobami prywantnie i niestety nigdy nie robi jednego zapytania. Na message_users robi oddzielne zapytanie.
Takze jak juz pisalem wczesniej, do $options dodałem left join message_users i teraz dopiero mam jedno zapytanie jak chciałem.
phpion
Tak abstrahując od problemu to lepiej by było gdybyś rozpoczął pobieranie danych z message_users i dopiero do tego dołączał messages. No ale pewnie ORM na to nie pozwoli.

nospor
Tak, tak właśnie normalnie bym zrobił. Niestety przerabiam gotowy kod, jest kilka podobnych Modeli korzystających z jednego mechanizmu i niestety muszę się tutaj dostosować
Riggs
Z tego co pamiętam to w CakePHP dało się wymusić JOIN i wtedy szło jedno zapytanie. Ale nie było to zbyt intuicyjne korzystając z ORM...
nospor
Jak juz pisalem wymusiłem JOIN w $options dla find(). Chyba, że ty mówisz o jeszcze innym wymuszeniu
Riggs
Dokładnie o to mi chodziło, nie doczytałem poprzedniego posta
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.