eloquent search/where 自定义属性
eloquent search/where on custom attributes
我向我的模型添加了自定义属性
public function getTouchedAttribute() { ...
我想将其添加到查询中
hasMany()->where('touched', ...)
但显然这不是 table 中的专栏。
实现此行为最优雅的方法是什么?
一个选项(在性能方面可能是更好的选项)是使用原始 SQL 函数模拟属性。 (无法帮助你,因为我不知道 touched
是做什么的)
另一种方法是对生成的集合使用 filter
:
$collection = Model::all();
$filtered = $collection->filter(function($model){
return $model->touched == true;
});
我知道这是一个已有 4 年历史的话题(从 2015 年开始),但它仍在从网络搜索中获得流量。
所以我想分享一个想法;
您可以使用 Eloquent 的 Local Query Scopes 来定义自定义 where 子句。
如文档中所述:
Local scopes allow you to define common sets of constraints that you
may easily re-use throughout your application. For example, you may
need to frequently retrieve all users that are considered "popular".
To define a scope, prefix an Eloquent model method with scope.
还有一个例子:
如果您在模型上定义自定义范围:
public function scopePopular($query)
{
return $query->where('votes', '>', 100);
}
您可以直接将其与您的模型一起使用。
App\User::popular()->orderBy('created_at')->get();
因此您可以定义一个 scopeTouched()
方法并实现您的逻辑。
我假设如果 updated_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();
我向我的模型添加了自定义属性
public function getTouchedAttribute() { ...
我想将其添加到查询中
hasMany()->where('touched', ...)
但显然这不是 table 中的专栏。
实现此行为最优雅的方法是什么?
一个选项(在性能方面可能是更好的选项)是使用原始 SQL 函数模拟属性。 (无法帮助你,因为我不知道 touched
是做什么的)
另一种方法是对生成的集合使用 filter
:
$collection = Model::all();
$filtered = $collection->filter(function($model){
return $model->touched == true;
});
我知道这是一个已有 4 年历史的话题(从 2015 年开始),但它仍在从网络搜索中获得流量。 所以我想分享一个想法;
您可以使用 Eloquent 的 Local Query Scopes 来定义自定义 where 子句。
如文档中所述:
Local scopes allow you to define common sets of constraints that you may easily re-use throughout your application. For example, you may need to frequently retrieve all users that are considered "popular". To define a scope, prefix an Eloquent model method with scope.
还有一个例子: 如果您在模型上定义自定义范围:
public function scopePopular($query)
{
return $query->where('votes', '>', 100);
}
您可以直接将其与您的模型一起使用。
App\User::popular()->orderBy('created_at')->get();
因此您可以定义一个 scopeTouched()
方法并实现您的逻辑。
我假设如果 updated_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();