2015-06-19 43 views
6

Używam CakePHP w wersji 3.x.Wiele skojarzeń z tym samym modelem w CakePHP 3

Kiedy wysyłam zapytanie do MessagesTable, chcę uzyskać dane użytkowników dla nadawcy i odbiorcy wiadomości. Robiłem to wiele razy w CakePHP 2, ale nie mogę zrozumieć, dlaczego nie działa w wersji 3.x.

Mam Tabela UsersTable i MessagesTable.

UsersTable

$this->hasMany('Messages'); 

MessagesTable

$this->belongsTo('Users', [ 
    'foreignKey' => 'sender_id', 
    'propertyName' => 'Sender', 
]); 
$this->belongsTo('Users', [ 
    'foreignKey' => 'user_id', 
    'propertyName' => 'Receiver' 
]); 

To zapytanie używam

$messages = $this->Messages->find() 
     ->where(['Messages.user_id' => $this->Auth->user('id')]) 
     ->orwhere(['Messages.sender_id' => $this->Auth->user('id')]) 
     ->order(['Messages.created' => 'DESC']) 
     ->contain([ 
      'Users.Pictures', 
     ]); 

jestem coraz danych słuchawkę, ale nie dane nadawcy, jak również. Każda pomoc będzie naprawdę doceniana.

Odpowiedz

8

Twoje skojarzenia są błędne. W przypadku korzystania z tego samego modelu dla wielu stowarzyszeń trzeba używać różnych aliasów i właściwość className (podobnie jak w CakePHP 2): -

$this->belongsTo('Sender', [ 
    'className' => 'Users', 
    'foreignKey' => 'sender_id', 
    'propertyName' => 'sender', 
]); 
$this->belongsTo('Receiver', [ 
    'className' => 'Users', 
    'foreignKey' => 'user_id', 
    'propertyName' => 'receiver' 
]); 

To described in the docs.

W Twoim przykładowym kodzie Receiver zastępuje się powiązanie dla User, więc w wynikach widoczny jest tylko model Receiver.

Zapytanie następnie musi być coś takiego: -

$messages = $this->Messages->find() 
    ->where(['Messages.user_id' => $this->Auth->user('id')]) 
    ->orwhere(['Messages.sender_id' => $this->Auth->user('id')]) 
    ->order(['Messages.created' => 'DESC']) 
    ->contain([ 
     'Receivers' => ['Pictures'], 
     'Senders' => ['Pictures'] 
    ]); 
+0

Dziękuję za @drmonkeyninja odpowiedzi. Twoja sugestia była pierwszą rzeczą, której próbowałem, ale spowodowało to błąd informujący, że wiadomości nie są powiązane z użytkownikami, mimo że są powiązane, co prowadzi mnie do przekonania, że ​​robiłem to źle w CakePHP 3, dlatego to zmieniłem. Jakieś pomysły na to, dlaczego podaje ten błąd? – Wisd0m

+0

@ Wisd0m to model użytkowników w wtyczce? – drmonkeyninja

+0

Brak mojego modelu Użytkownicy nie ma wtyczki. Czy to naprawdę dziwne, że to, że daje mi ten błąd, może mieć coś wspólnego z użytkownikami ma wiele relacji ("wiadomości")? – Wisd0m

2

Dziękuję za pomoc @drmonkeyninja. Znalazłem, co było nie tak, wszystko, co musiałem zrobić, to zadzwonić do stowarzyszeń użytkowników zdefiniowanych w MessagesTable, teraz czuję się tak głupi.

MessagesTable

$this->belongsTo('Sender', [ 
    'className' => 'Users', 
    'foreignKey' => 'sender_id', 
    'propertyName' => 'Sender', 
]); 
$this->belongsTo('Receiver', [ 
    'className' => 'Users', 
    'foreignKey' => 'user_id', 
    'propertyName' => 'Receiver' 
]); 

Kwerenda, która działa:

$messages = $this->Messages->find() 
     ->where(['Messages.user_id' => $this->Auth->user('id')]) 
     ->orwhere(['Messages.sender_id' => $this->Auth->user('id')]) 
     ->order(['Messages.created' => 'DESC']) 
     ->contain([ 
      'Sender', 
      'Receiver' 
     ]) 
    ;