【问题标题】:Multiple Associations to the Same Model in CakePHP 3CakePHP 3 中同一模型的多个关联
【发布时间】:2015-06-19 01:02:55
【问题描述】:

我使用的是 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',
        ]);

我正在取回 Receiver 数据,但也没有 Sender 数据。任何帮助将不胜感激

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢@drmonkeyninja 的回复。您的建议是我尝试的第一件事,但这给了我一个错误,说消息与用户没有关联,即使它们是关联的,这让我相信我在 cakePHP 3 中做错了,所以这就是我改变它的原因。关于它为什么给出这个错误的任何想法?
    • @Wisd0m 是插件中的用户模型吗?
    • 不,我的用户模型不在插件中。它给我这个错误真的很奇怪,它可能与Users hasMany('Messages')关系有关吗?
    • @Wisd0m 如果你不使用插件,为什么你有contain(['Users.Pictures'])?当您从 Messages 模型中查询时,我不会认为 Users hasMany('Messages') 关系应该很重要。
    • propertyName 的 Cake 约定是使用模型名称的小写下划线单数版本,这一点毫无价值。
    【解决方案2】:

    感谢您的帮助@drmonkeyninja。我发现出了什么问题,我需要做的就是调用我在 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'
            ])
        ;
    

    【讨论】:

      猜你喜欢
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      相关资源
      最近更新 更多