Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [CakePHP] relacja hasMany
nospor
post
Post #1





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
kicaj
post
Post #2





Grupa: Zarejestrowani
Postów: 1 640
Pomógł: 28
Dołączył: 13.02.2003
Skąd: Międzyrzecz/Poznań

Ostrzeżenie: (0%)
-----


Patrząc na twoje tabele, to raczej jest relacja HABTM...
Go to the top of the page
+Quote Post
nospor
post
Post #3





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Tak, też do tego doszedłem. Nie mniej jednak nadal przy HABTM nie pobiera mi danych jednym zapytaniem tylko kilkoma.
Go to the top of the page
+Quote Post
kicaj
post
Post #4





Grupa: Zarejestrowani
Postów: 1 640
Pomógł: 28
Dołączył: 13.02.2003
Skąd: Międzyrzecz/Poznań

Ostrzeżenie: (0%)
-----


Pokaż kod którym pobierasz dane (np. metodę find)
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




$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.
Go to the top of the page
+Quote Post
phpion
post
Post #6





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.

Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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ć
Go to the top of the page
+Quote Post
Riggs
post
Post #8





Grupa: Zarejestrowani
Postów: 162
Pomógł: 13
Dołączył: 16.06.2007

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Jak juz pisalem wymusiłem JOIN w $options dla find(). Chyba, że ty mówisz o jeszcze innym wymuszeniu
Go to the top of the page
+Quote Post
Riggs
post
Post #10





Grupa: Zarejestrowani
Postów: 162
Pomógł: 13
Dołączył: 16.06.2007

Ostrzeżenie: (0%)
-----


Dokładnie o to mi chodziło, nie doczytałem poprzedniego posta

Ten post edytował Riggs 24.02.2015, 13:53:52
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 16:20