在 keyup 上查询客户时的混合结果

Mixed results when querying for customers on keyup

我的 JS 前端通过按键查询客户,在 axios 进行查询之前输入最少 3 个字符,即:/api/customers/q?=kev/api/customers/q?=kevi/api/customers/q?=kevin

我似乎从来没有得到预期的结果。如果将全名粘贴到输入中并一次性查询“kevin”,kevin 将从 api 中 return。这是我的查询:

// Other variables are not shown ie $postcode

$customers =  $this->with(['foo', 'bar', 'baz'])->whereRaw("lower(FirstName) like '${query}'")
            ->orWhereRaw("lower(Surname) like '${query}'")
            ->orWhereRaw("CONCAT(lower(FirstName), ' ', lower(Surname)) like '${query}'")
            ->orWhereRaw("lower(CompanyName) like '${query}'")
            ->orWhereRaw("lower(EmailAddress) like '${query}'")
            ->orWhere(function($customers) use ($postcode)  {
                if(isset($postcode)) {
                    $postcode = strtolower($postcode);
                    $customers->whereRaw("lower(PostCode) = '${postcode}'");
                }
            })
            ->where('Foo_ID', $fooId)
            ->paginate(20);

我希望当用户输入“kevin”时,一个字母接一个字母,客户 kevin 应该被 returned,因为“kevin”在数据库中,我应该在输入中粘贴“kevin” , 凯文 returns.

目前我必须在 JS 中使用 onBlur,这会将完整的名称传递给 API,但我不想那样。

除了上面的评论外,我还添加了@Sylar 的有效答案。

如果我是对的,您应该将 orWhereRaw 分组到一个闭包中。来自文档:“如果您需要在括号内对“或”条件进行分组,您可以将闭包作为第一个参数传递给 orWhere 方法”:laravel.com/docs/6.x/queries#where-clauses

$customers = $this->with(['foo', 'bar', 'baz'])
    ->where(function ($query) use ($postcode) {
        $query
            ->whereRaw("lower(FirstName) like '${query}'")
            ->orWhereRaw("lower(Surname) like '${query}'")
            ->orWhereRaw("CONCAT(lower(FirstName), ' ', lower(Surname)) like '${query}'")
            ->orWhereRaw("lower(CompanyName) like '${query}'")
            ->orWhereRaw("lower(EmailAddress) like '${query}'")
            ->orWhere(function($customers) use ($postcode)  {
                if(isset($postcode)) {
                    $postcode = strtolower($postcode);
                    $customers->whereRaw("lower(PostCode) = '${postcode}'");
                }
            });
    })
    ->where('Foo_ID', $fooId)
    ->paginate(20);