【问题标题】:Laravel Eloquent orWherePivot Not Returning Expected ResultLaravel Eloquent orWherePivot 不返回预期结果
【发布时间】:2020-04-17 19:29:15
【问题描述】:

我有一个雄辩的查询,但没有得到预期的结果,我希望有人可以向我解释编写查询的正确方法。

我有三张桌子:

records (belongsToMany users)
users (belongsToMany records)
record_user (pivot)

record_user 表还有一个用于role 的列。

我尝试获取用户拥有rolesingersongwriter 的所有记录:

$results = User::find(Auth::user()->id)
                    ->records()
                    ->wherePivot('role', 'singer')
                    ->orWherePivot('role', 'songwriter')
                    ->get();

下面是 SQL 语法的生成方式:

select `records`.*, `record_user`.`user_id` as `pivot_user_id`,
`record_user`.`record_id` as `pivot_record_id` from `records` 
inner join `record_user` on `records`.`id` = `record_user`.`property_id` 
where
`record_user`.`user_id` = '1' and `record_user`.`role` = 'singer' or 
`record_user`.`role` = 'songwriter'

singer 角色的结果符合预期:用户为歌手的所有记录。问题是songwriter 的结果:我得到了所有的词曲作者,并且查询不受user_id 的限制。出于某种原因,我期望songwriter 角色也受到user_id 的约束 - 使用雄辩的语法编写这个的正确方法是什么?

【问题讨论】:

  • 那么你到底想要得到什么?用户是词曲作者或歌手的所有记录?

标签: laravel eloquent


【解决方案1】:

嗯..我认为您需要使用高级 where 子句。

$results = Auth::user()
            ->records()
            ->where(function($query) {
                $query->where('record_user.role', '=', 'singer')
                      ->orWhere('record_user.role', '=', 'songwriter');
            })
            ->get();

【讨论】:

  • 是的,previous where 子句解决了这个问题,并导致了一个查询,其中角色被括在(...) 一起:and ('record_user'.'role' = 'singer' or 'recored_user'.'role' = 'songwriter')。我仍然有点困惑,为什么它一开始就没有以这种方式运行。感谢您的帮助!
【解决方案2】:

这是 Laravel 的问题。就我而言,我是这样解决的:

$results = Auth::user()
                 ->records()
                 ->wherePivot('role', 'singer')
                 ->orWherePivot('role', 'songwriter')
                 ->where('user_id', Auth::id())
                 ->get();

或者使用前置where子句

【讨论】:

    【解决方案3】:

    如果您尝试获取记录,我会做类似的事情:

    User::find(Auth::user()->id)
        ->records()
        ->where(function($q){
            $q->where('records.role', 'singer')
                ->orWhere('records.role', 'songwriter');
        })->get();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多