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

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

我使用的是 cakePHP 版本 3.x。

当我查询 MessagesTable 时,我想获取消息发送者和接收者的用户数据。我在 cakePHP 2 中做过很多次,但我无法弄清楚为什么它在 3.x 版中不起作用。

我有一个 UsersTable 和一个 MessagesTable。

用户表

$this->hasMany('Messages');

消息表

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

我正在取回接收方数据,但也没有取回发送方数据。任何帮助将不胜感激

最佳答案

您的联想是错误的。如果对多个关联使用相同的模型,则需要使用不同的别名和 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']
    ]);

关于php - CakePHP 3 中同一模型的多个关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30928324/

相关文章:

php - 建议 : building a non-database driven simple CMS in PHP

php - 从 mysql 获取数据并以周为单位进行分组并显示日期

security - 在 cakephp 中使用 'low' 安全性有什么含义?

php - Cake PhP 3 多级保存关联数据

php - 计算行出现次数并打印它们

php - 是否可以在 PHP 中临时更改 PATH?

php - 为什么这个 PHP 正则表达式不从 css 值中提取 url?

php - 如何编写查询以检查列值是否在可能为空的 PHP 数组中

php - 使用 CakePHP 存储 SQL 数据以供离线使用

validation - Cakephp-3 条件 notEmpty 验证行为