我有一个表,其中包含充当过滤器的输入字段。Orders 表和 Users 表中的值有关系。
例如:
Order Id | User Full Name | Order Price | Date |
[order filter] [user name filter] [order date filter]
Run Code Online (Sandbox Code Playgroud)
如何通过关系从用户表中过滤值?
这当然会返回错误:
public function name($name)
{
return $this->builder->where('name', 'LIKE', '%$name%')->orWhere('surname', 'LIKE', '%$name%');
}
Run Code Online (Sandbox Code Playgroud)
错误:
QueryException in Connection.php line 770:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'name' in 'where clause' (SQL: select count(*) as aggregate from `orders` where (`name` LIKE %$name% or `surname` LIKE %$name%))
Run Code Online (Sandbox Code Playgroud)
您可以将条件直接添加到查询构建器或创建范围。
将此添加到您的订单模型中。
public function scopeFilterUser($query, $name)
{
return $query->whereHas('user', function ($q) use ($name) {
$q->where('name', 'like', "%{$name}%")
->orWhere('surname', 'like', "%{$name}%");
});
}
Run Code Online (Sandbox Code Playgroud)
像这样使用它
$orders = Order::filterUser($name)->get();
Run Code Online (Sandbox Code Playgroud)
直接应用条件。
$orders = Order::whereHas('user', function ($query) use ($name) {
$query->where('name', 'like', "%{$name}%")
->orWhere('surname', 'like', "%{$name}%");
})->get();
Run Code Online (Sandbox Code Playgroud)
编辑:基于您的过滤方法。
public function name($name)
{
return $this->builder->whereHas('user', function ($q) use ($name) {
$q->where('name', 'like', "%{$name}%")
->orWhere('surname', 'like', "%{$name}%");
});
}
Run Code Online (Sandbox Code Playgroud)