Laravel如何在查询构建时通过条件将参数传递给模型中的Accessor方法?

时间:2018-11-06 17:35:17

标签: laravel laravel-5 eloquent

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

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

但是size是数组,我可以以任何方式操纵它,以便仅在size具有特定大小的情况下才可以检查返回值。

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

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

现在如何在

之类的条件下使用它
$collections = $collections->where('is_size','S');

2 个答案:

答案 0 :(得分:0)

您应该在集合上使用filter

$collections = $collections->filter(function($item, $index) {
    return in_array('S', $item->sizes);
});

答案 1 :(得分:0)

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