Laravel模型

时间:2016-08-04 08:29:16

标签: php laravel eloquent

假设我有一个功能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();

2 个答案:

答案 0 :(得分:1)

使用Query Scope

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();
}