我一直在尝试根据过滤条件(比如学生的姓氏)过滤属于子类的学生。
在我的 Laravel 5.0 应用中,我有模型Subclass
和Student
,其关系和类定义如下:
关系:
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
本身是否有任何问题的过滤模型。
在这方面的任何帮助将不胜感激。
答案 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