雄辩的搜索/自定义属性的位置

时间:2015-01-19 07:50:46

标签: laravel eloquent

我在模型中添加了自定义属性

public function getTouchedAttribute() { ...

我想将此添加到查询

hasMany()->where('touched', ...)

但显然这不是表格中的一列。

实现此行为的最优雅方式是什么?

2 个答案:

答案 0 :(得分:7)

一个选项(在性能方面可能是更好的选项)是使用原始SQL函数模拟属性。 (无法帮助你,因为我不知道touched做了什么)

另一种方法是在结果集合上使用filter

$collection = Model::all();
$filtered = $collection->filter(function($model){
    return $model->touched == true;
});

答案 1 :(得分:0)

我知道这是一个有4年历史的主题(从2015年开始),但是它仍然通过网络搜索获得流量。 所以我想分享一个想法;

您可以使用Eloquent的Local Query Scopes来定义自定义where子句。

如文档所述:

  

本地范围允许您定义常见的约束集   可以轻松地在整个应用程序中重复使用。例如,您可能   需要经常检索所有被认为“受欢迎”的用户。   要定义范围,请在Eloquent模型方法的范围前添加前缀。

和一个例子: 如果您在模型上定义自定义范围:

public function scopePopular($query)
{
    return $query->where('votes', '>', 100);
}

您可以直接在模型中使用它。

App\User::popular()->orderBy('created_at')->get();

因此,您可以定义scopeTouched()方法并实现您的逻辑。 我假设如果update_at不等于created_at,则在此处触摸该行。当然,您可以更改此行为。

public function scopeTouched($query)
{
    return $query->where('updated_at', '!=', 'created_at');
}

并与您的模型一起使用。

Model::touched()->get();

当然,您可以将其与其他查询构建器方法一起使用。

Model::touched()->paginate(20);
Model::touched()->orderBy('id', 'DESC')->take(10)->get();
Model::touched()->latest()->first();