Laravel 有说服力的搜索/自定义属性上的位置

Laravel 有说服力的搜索/自定义属性上的位置,laravel,eloquent,Laravel,Eloquent,我在模型中添加了一个自定义属性 public function getTouchedAttribute() { ... 我想将此添加到查询中 hasMany()->where('touched', ...) 但很明显,这不是表中的一列 实现此行为最优雅的方法是什么?一个选项(可能是性能更好的选项)是使用原始SQL函数模拟属性。(我帮不了你,因为我不知道topped做什么) 另一种方法是对结果集合使用过滤器: $collection = Model::all(); $filtered =

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

public function getTouchedAttribute() { ...
我想将此添加到查询中

hasMany()->where('touched', ...)
但很明显,这不是表中的一列

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

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

另一种方法是对结果集合使用
过滤器

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

我知道这是一个4年前的话题(从2015年开始),但它仍然从网络搜索中获得流量。 所以我想分享一个想法

您可以使用Eloquent来定义自定义where子句

如文件所述:

局部作用域允许您定义所需的公共约束集 可在整个应用程序中轻松重复使用。例如,您可以 需要经常检索所有被认为“受欢迎”的用户。 要定义范围,请在雄辩的模型方法前面加上范围

举个例子: 如果在模型上定义自定义范围:

public function scopePopular($query)
{
    return $query->where('votes', '>', 100);
}
您可以将其直接用于您的模型

App\User::popular()->orderBy('created_at')->get();
Model::touched()->get();
因此,您可以定义
scopeTouched()
方法并实现您的逻辑。 我假设,如果此处触按的是updated_at不等于created_at行。当然,你可以改变这种行为

public function scopeTouched($query)
{
    return $query->where('updated_at', '!=', 'created_at');
}
并与您的模型一起使用

App\User::popular()->orderBy('created_at')->get();
Model::touched()->get();
当然,您可以将其与其他查询生成器方法一起使用

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

好。这很好。如果它是一个简单的sql查询,那么我会这样做,但它是几个查询和一些其他变量的合并。