首页 > 解决方案 > Laravel 关联关系

问题描述

我对使用它 Laravel 关系感到困惑。我正在创建 Messenger。我使用以下数据库架构。如果两个用户聊天,messages_members 表将包含两个相同的行——只有用户列会不同。如果我需要一个“对话”方法来获取用户曾经与之聊天的所有用户,我应该如何编写用户模型?我不能写一个 Laravel 的关系,我会忽略与所有者正在查看对话的那个 ID 的行。我假设要在关系消息 -> messages_members 中获取消息,只需编写:

class MessagesMembers extends Model {
public function messages(int $limit): BelongsTo
   {
      return $this->belongsTo(Message::class, 'conversation_id')
         ->orderBy('created_at', 'DESC')
         ->limit($limit);
   }
}

谢谢你的想法! 在此处输入图像描述

标签: phplaraveleloquent

解决方案


谢谢大家 - 我用子查询解决它:

public function conversations(int $limit = null): object
{
    $table = (new MessagesMembers)->getTable();

    return $this->hasMany(MessagesMembers::class, 'user', 'id')
        ->addSelect(['user' => function ($query) use ($table) {
            $query->addSelect('user')
                ->from($table . ' AS sub')
                ->where('user', '!=', $this->getAttribute('id'))
                ->whereRaw('`sub`.`conversation_id` = `' . $table . '`.`conversation_id`');
        }])
        ->orderBy('created_at', 'DESC')
        ->limit($limit)
        ->get();
}

推荐阅读