具有不同查询范围的同一个雄辩查询

时间:2017-06-23 08:22:18

标签: php laravel laravel-eloquent

我有一个用户模式

class User extends Model {
 public function scopeNeutral($query)
 {
   return $query->where('score', 0);
 }

 public function scopePositive($query)
 {
    return $query->where('score', '>', 8);
 }

 public function scopeNegative($query)
 {
  return $query->whereBetween('score', [1, 3]);
 } 

 public function team()
 {
      return $this->belongsTo(Team::class);
 }
}

我需要获得控制器中团队的所有积极,消极和中立的用户,

e.g

$users = $team->users();

$positive = $users->positive();
$negative = $users->negative();
$neutral  = $users->neutral();

这样做是在每次使用查询时追加where子句,我需要为每次使用单独查询。

2 个答案:

答案 0 :(得分:0)

您是否尝试过以下

$positive = $team->users()->positive()->get(); 
$negative = $team->users()->negative()->get(); 

您面临的问题是查询对象$users每次调用方法时都会添加一个where子句。

答案 1 :(得分:0)

您遇到的问题是由于您正在使用的范围方法实际上正在更改$ users对象的内部状态。

例如,您可以克隆原始的$ users对象,如下所示:

$users = $team->users();

$positive = clone $users; $positive = $positive->positive();

$negative = clone $users; $negative = $negative->negative();

$neutral = clone $users; $negative->neutral();

很抱歉这里的命名很差,我希望你明白这一点。

我认为还有一种newQuery方法可行,但在解决方案之上,我肯定会有效。

Here you can read about cloning objects in PHP