首页 > 解决方案 > Laravel如何在查询构建时通过where条件将参数传递给模型中的Accessor方法?

问题描述

我在集合模型getSizesAttribute中有一个Accessor方法,它返回可用大小的数组,例如:['S','L'],现在我需要获取大小为'S'的模型。喜欢:

$collections = $collections->where('sizes','S');

但是大小是数组,我可以无论如何操作它,以便只有在大小具有特定大小时才能检查返回。

我尝试制作另一种方法 getIsSizeAttribute,例如:

public function getIsSizeAttribute($size){
      return in_array($size,$this->sizes);
}

现在我怎么能在 Where 条件下使用它

$collections = $collections->where('is_size','S');

标签: laravellaravel-5eloquent

解决方案


MutatorsAccessors仅在查询已经执行后才运行肤浅。您可以按照 Bangnokia 的建议使用Collection::filter(),但这不会给您实际将条件应用于初始请求的任何性能优势。

我认为您在这里寻找的是Query Scope。将这样的内容添加到您的 Model 类中:

public function scopeSize(\Illuminate\Database\Eloquent\Builder $query, $size)
{
    return $query->whereIn('sizes', $this->sizes[$size]);
}

并像这样访问它:

$collection = $model->size('S')->get();

推荐阅读