【问题标题】:Laravel, where, orwhere in main table an pivot tableLaravel, where, or where in main table 一个数据透视表
【发布时间】:2018-11-12 12:10:19
【问题描述】:

我有两个具有 belongsToMany 关系的表:message_topicsusers

数据透视表是 message_topics_users,包含 2 列:message_id 和 user_id。

在表 message_topics 中,我有一个名为 sender_id

的字段

我正在尝试编写正确的雄辩语法来获取所有记录:

其中 message_topics.sender_id = $user_id 或 Message_topics_users.receiver_id = $user_id

我尝试了很多东西,例如:

$topics = MessageTopic::where('sender_id', $user_id)
    ->wherePivot('receiver_id', $user_id)->orderBy('sent_at','desc')->get();

有什么想法吗?

【问题讨论】:

  • 我是否正确假设 usersMessageTopic 中的 belongsToMany 关系只是称为 users
  • 您能否就答案提供反馈?

标签: laravel eloquent laravel-5.5


【解决方案1】:

您可以使用whereHas 方法(或在本例中为orWhereHas 方法):

$topics = MessageTopic::where('sender_id', $user_id)
    ->orWhereHas('users', function ($query) use ($user_id) {
        $query->where('id', $user_id);
    })
    ->orderBy('sent_at', 'desc')
    ->get();

【讨论】:

    【解决方案2】:

    我假设您有两个来自主题的关系?既然用两列和同一个关系太随意了……像这样

    //On your MessageTopic model
    public function sender(){
        return $this->belongsToMany('App\User', 'message_topics_users', 'message_id', 'sender_id');
    }
    
    public function receiver(){
        return $this->belongsToMany('App\User', 'message_topics_users', 'message_id', 'receiver_id'));
    }
    

    然后你可以像这样使用 whereHas 和 orWhereHas:

    //Again assuming you have your User model loaded as $user
    $topics = App\Topic::whereHas('sender', function($q) use($user){
        $q->where('sender_id', '=', $user->id);
    })
    ->orWhereHas('receiver', function($q) use($user){
       $q->where('receiver_id', '=', $user->id
    })
    ->orderByDesc('sent_at')
    ->get();
    

    whereHas 和 orWhereHas 都查询模型(在本例中为 MessageTopic),检查是否存在指定的关系(App\Topic::whereHas('sender')...)。它们还允许您传递您正在寻找的约束 (function($q) use($user){ $q->... })

    所以它基本上是在说“只给我发送者或接收者 ID 为 $user->id 的 MessageTopics”

    【讨论】:

      猜你喜欢
      • 2014-06-28
      • 2011-01-10
      • 2015-08-06
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 2019-09-30
      • 2017-12-07
      • 2021-11-19
      相关资源
      最近更新 更多