Php 具有多态性关系的Laravel

Php 具有多态性关系的Laravel,php,laravel,eloquent,Php,Laravel,Eloquent,拉威尔5.8。我有一张桌子,cats: id | name --------- 1 | jim 2 | mary 和一个表颜色: id | color ---------- 1 | white 2 | black 我使用多态关系将颜色附加到猫(和其他生物)上。我有一张彩色表: id | color_id | colorable_id | colorable_type --------------------------------------------- 1 | 1

拉威尔5.8。我有一张桌子,
cats

id | name
---------
1  | jim
2  | mary
和一个表
颜色

id | color
----------
1  | white
2  | black
我使用多态关系将颜色附加到猫(和其他生物)上。我有一张
彩色表

id | color_id | colorable_id | colorable_type
---------------------------------------------
1  | 1        | 2            | 'App\Cat'
在我的
Cat
型号中

public function colors()
{
  return $this->morphToMany('App\Color', 'colorable');
}
我有这个控制器代码来获取给定颜色的所有猫:

public function index(Request $request)
{
  $cats = new Cat;
  if ($request->has('color')) {
    $color = $request->color;
    $cats->whereHas('colors', function ($query) use ($color) {
      $query->where('color_id', $color);
    });
  }
  return $cats->get();
}

但是它会返回所有猫,而不管它们的颜色。

新猫
更改为
Cat::query()

公共功能索引(请求$Request)
{
$cats=Cat::query();
如果($request->has('color')){
$color=$request->color;
$cats->whereHas('colors',函数($query)use($color){
$query->where('color\u id',$color);
});
}
return$cats->get();
}
或者仍然使用
new
,但在查询时分配给变量:

公共功能索引(请求$Request)
{
$cats=新猫;
如果($request->has('color')){
$color=$request->color;
$cats=$cats->whereHas('colors',函数($query)use($color){
$query->where('color\u id',$color);
});
}
return$cats->get();
}

您将cats声明为一个新对象,然后使用条件查询它。试试这个

public function index(Request $request)
{
  $color = $request->has('color') : $request->get('color') : null;
  $cats = Cat::when($color, function ($query) use ($color) {
      $query->where('color_id', $color);
    })->get();
}

您还可以使用laravel when()方法使代码更具可读性,您的代码应该如下所示

public function index(Request $request)
{
    $cats = Cat::query();

    $query->when($request->has('color'), function ($q) {
        return $q->whereHas('colors', function ($query) use ($request->color){
             $query->where('color_id', $color);
        }
    });

    return $query->get();
}

$request->has('color')
false吗?@TsaiKoga不,它有一个值。