繁体   English   中英

Laravel 的 whereHas 没有过滤关系的获取结果(一对多)

[英]Laravel's whereHas not filtering fetched results for a relationship (one-to-many)

我一直在试图属于基于过滤标准的一个子类过滤器的学生(比如学生的姓)。
在我的Laravel 5.0应用程序中,我有模型SubclassStudent ,它们的关系和类定义如下:

关系

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

您的第二种方法也是有效的,但是您正在获取一个带有其StudentsSubClass ,因此如果我的解释正确,您将获得比您实际想要或需要的更多。


也有可能我误解了你的问题,而你试图让所有与SubClass至少有一种关系的Students 如果是这样,您可以使用此查询:

$students = Student::has('subClass')->get();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM