簡體   English   中英

CakePHP 3中同一模型的多個關聯

[英]Multiple Associations to the Same Model in CakePHP 3

我正在使用cakePHP版本3.x.

當我查詢MessagesTable時,我想獲取發送者和消息接收者的用戶數據。 我已經在cakePHP 2中多次這樣做但我無法弄清楚為什么它不能在3.x版本中運行。

我有一個UsersTable和一個MessagesTable。

UsersTable

$this->hasMany('Messages');

MessagesTable

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

這是我正在使用的查詢

$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',
        ]);

我收回了Receiver數據,但也沒有收到Sender數據。 任何幫助將非常感激

你的關聯是錯的。 如果對多個關聯使用相同的模型,則需要使用不同的別名和className屬性(就像在CakePHP 2中一樣): -

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

在文檔中描述

在您的示例代碼中, Receiver會覆蓋User的關聯,因此您只能在結果中看到Receiver模型。

您的查詢需要是這樣的: -

$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']
    ]);

謝謝你的幫助@drmonkeyninja。 我發現了什么問題,我需要做的就是調用我在MessagesTable中定義的用戶關聯,我現在感覺很蠢。

MessagesTable

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

有效的查詢:

$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'
        ])
    ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM