假设我有一个功能getActive()
和getInactive()
的“学生”模型,如下所示:
public static function getActive()
{
return Student::with(['user', 'country', 'course', 'gender', 'language' => function($q){$q->orderBy('name');}])->where('active', 1)->get();
}
public static function getInactive()
{
return Student::with(['user', 'country', 'course', 'gender', 'language' => function($q){$q->orderBy('name');}])->where('active', 0)->get();
}
如您所见,唯一的区别是每个查询末尾的>where('active', 0)
。
我正在尝试声明一个全局“基本查询”,我最后会在其中附加where
条件。像这样:
$baseQuery;
public function __construct()
{
$baseQuery = Student::with(['user', 'country', 'course', 'gender', 'language' => function($q){$q->orderBy('name');}]);
}
public static function getActive()
{
return $baseQuery->where('active', 1)->get();
}
public static function getInactive()
{
return $baseQuery->where('active', 0)->get();
}
这不仅可以节省冗余代码,还可以使我的代码更加清晰可见,但作为一个新手,我正在努力解决代码问题。
有什么想法吗?
编辑1:
我从我的控制器那里这样称呼它:
$students = Profile::getActive();
答案 0 :(得分:1)
public function scopeRetrieve($query)
{
return $query->with(['user', 'country', 'course', 'gender', 'language'])->orderBy('name');
}
public static function scopeActive($query)
{
return $query->where('active', 1);
}
public static function scopeInactive()
{
return $query->where('active', 0);
}
您可以这样称呼它:
Profile::retrieve()->active()->get();
Profile::retrieve()->inactive()->get();
它鼓励可重用性,因为您将它们分解为自己的块,下次如果您有更多限制或过滤,您可以添加它。
答案 1 :(得分:0)
您可以使用whereIn方法.whereIn方法验证给定列的值是否包含在给定数组中:
public static function getInactiveOrInactive()
{
return Student::with(['user', 'country', 'course', 'gender', 'language' => function($q){$q->orderBy('name');}])->->whereIn('active', [0,1])->get();
}