CakePHP 3中同一模型的多个关联

时间:2015-06-19 01:02:55

标签: php cakephp cakephp-3.0 model-associations belongs-to

我正在使用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数据。任何帮助都会非常感激

2 个答案:

答案 0 :(得分:11)

你的关联错了。如果对多个关联使用相同的模型,则需要使用不同的别名和className属性(就像在CakePHP 2中一样): -

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

这是described in the docs

在您的示例代码中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']
    ]);

答案 1 :(得分:2)

感谢您的帮助@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'
        ])
    ;