[英]Laravel's whereHas not filtering fetched results for a relationship (one-to-many)
我一直在试图属于基于过滤标准的一个子类过滤器的学生(比如学生的姓)。
在我的Laravel 5.0应用程序中,我有模型Subclass
和Student
,它们的关系和类定义如下:
关系:
Subclass
HasMany Student
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();
我已经按照文件上过滤查询模式,从技术上讲,它应该是工作,但预计它不过滤(事实上,它不是在所有的过滤,我没有得到一个students
,如果我把结果成关键一个数组)。
解决方法:在另一方面,如果我急于负载(下图)的获取模型(即with
法),该机型被过滤用相同的过滤标准(AND,我得到一个students
关键,如果返回的集合铸造成数组)。
$students = Subclass::whereId(1)->with(['students' => function($query){
return $query->filterStudents(Input::get('filter'));
}])->get();
whereId
指定的id
是可选的,因为省略它会考虑所有子类。 那么,我对whereHas
方法的实现是否有任何问题,或者whereHas
本身是否有任何问题(s)过滤模型。
在这方面的任何帮助将不胜感激。
问题是您正在获取错误模型的对象。 您在第一种方法中所做的是获取 ID 为 1 的所有SubClasses
和至少一个应用给定过滤器的Student
记录。 所以如果你想得到这个SubClass
Students
,你可以简单地反转查询:
$students = Student::whereHas('subClass', function($q) use ($subClassId) {
return $q->whereId($subClassId);
})->filterStudents(Input::get('filter'))->get();
您的第二种方法也是有效的,但是您正在获取一个带有其Students
的SubClass
,因此如果我的解释正确,您将获得比您实际想要或需要的更多。
也有可能我误解了你的问题,而你试图让所有与SubClass
至少有一种关系的Students
。 如果是这样,您可以使用此查询:
$students = Student::has('subClass')->get();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.