Laravel:具有关系的查询构建器

rit*_*its 1 php mysql laravel

我有一个表,其中包含充当过滤器的输入字段。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)

San*_*esh 8

您可以将条件直接添加到查询构建器或创建范围。

将此添加到您的订单模型中。

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)