Laravel在哪里没有过滤关系的结果(一对多)

时间:2015-08-01 11:27:06

标签: php laravel-5 eloquent

我一直在尝试根据过滤条件(比如学生的姓氏)过滤属于子类学生
在我的 Laravel 5.0 应用中,我有模型SubclassStudent,其关系和类定义如下:

关系

Subclass HasMany Student(s)

模型定义:

class Subclass extends Eloquent {

   .
   .
   .

    public function students() {
        return $this->hasMany('App\Models\Student');
    }
}
class Student extends Eloquent {

   .
   .
   .

    public function subclass() {
       return $this->belongsTo('App\Models\Subclass');
    }

    public function scopeFilterStudents($query, $filter){
       return $query->where('last_name', 'like', '%'. $filter .'%');
    }
}


问题 : 当我尝试使用whereHas过滤特定子类中的学生时会出现问题:

$students = Subclass::whereId(1)->whereHas('students', function($query){
      return $query->filterStudents(Input::get('filter'));
  })->get();

我已经按照documentation过滤查询模型,从技术上来说,它应该正常工作,但它没有按预期过滤(实际上,它根本没有过滤而我没有如果我将结果转换为数组,则获取students键。


解决方法: 另一方面,如果我急切地加载(下面)获取的模型(即使用with方法),模型将使用相同的过滤条件进行过滤( AND,我做如果返回的集合被强制转换为数组,则获取students密钥。

  $students = Subclass::whereId(1)->with(['students' => function($query){
      return $query->filterStudents(Input::get('filter'));
  }])->get();


  • 注意: 此处使用id指定的whereId是可选的,因为省略它会考虑所有子类。

那么,我的whereHas方法的实现是否有任何问题,或者whereHas本身是否有任何问题的过滤模型。

在这方面的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

问题是您正在获取错误模型的对象。您在第一种方法中所做的是获取ID为1的所有SubClasses以及给定过滤器适用的至少一个Student记录。因此,如果您希望获得此Students的{​​{1}},则可以简单地反转查询:

SubClass

您的第二种方法也是有效的,但是您正在使用$students = Student::whereHas('subClass', function($q) use ($subClassId) { return $q->whereId($subClassId); })->filterStudents(Input::get('filter'))->get(); 获取SubClass,因此如果我的解释正确,您获得的实际操作比实际需要或需要的更多。

我也可能错过了您的问题,并且您尝试获得与Students至少有一个关系的所有Students。如果是这样,您可以使用此查询:

SubClass