Laravel Eloquent 从不同领域搜索多个单词

问题描述 投票:0回答:3

我目前有以下代码正在运行...

$searchString = $request->searchstring;
$searchValues = preg_split('/\s+/', $searchString, -1, PREG_SPLIT_NO_EMPTY);
$cards=Card::where(function ($q) use ($searchValues){
    foreach($searchValues as $value){
        $q->orWhere('firstname', 'like', "%{$value}%");
        $q->orWhere('lastname', 'like', "%{$value}%");
        $q->orWhere('cardset', 'like', "%{$value}%");
    }
})->paginate(24);

当我执行 dd 操作时,它会生成以下 sql...

select * from "cards" where ("firstname" like ? or "lastname" like ? or "cardset" like ? or "firstname" like ? or "lastname" like ? or "cardset" like ?)

但是我想要的sql应该是...

select * from "cards" where ("firstname" like ? or "lastname" like ? or "cardset" like ?) AND ("firstname" like ? or "lastname" like ? or "cardset" like ?)

我尝试了一些方法,但似乎无法实现。

谢谢。

laravel eloquent
3个回答
4
投票

获取以下sql查询

select * from "cards" where ("firstname" like ? or "lastname" like ? or "cardset" like ?) AND ("firstname" like ? or "lastname" like ? or "cardset" like ?)

试试这个..

$cards = Card::Query();

foreach($searchValues as $value)
{
    $cards = $cards->where(function ($q) use ($value) {
                    $q->orWhere('firstname', 'like', "%{$value}%");
                    $q->orWhere('lastname', 'like', "%{$value}%");
                    $q->orWhere('cardset', 'like', "%{$value}%");
                });
}

$cards = $cards->paginate(24);

2
投票

试试这个:

$cards = Card::where(function ($q) use ($searchValues) {
    foreach ($searchValues as $value) {
        $q->where(function($q) use ($value) {
            $q->orWhere('firstname', 'like', "%{$value}%");
            $q->orWhere('lastname', 'like', "%{$value}%");
            $q->orWhere('cardset', 'like', "%{$value}%");
        });
    }
})

它产生:

select * from `cards` where ((`firstname` like ? or `lastname` like ? or `cardset` like ?) and (`firstname` like ? or `lastname` like ? or `cardset` like ?) and (`firstname` like ? or `lastname` like ? or `cardset` like ?))

0
投票

从 Laravel 10.47 开始,有新方法可以简化此操作:

whereAny
whereAll

上面的代码现在可以是:

$cards = Card::whereAny(['firstname','lastname','cardset'], 'LIKE', "%$value%");

Laravel 文档 - 其中任何/所有子句

© www.soinside.com 2019 - 2024. All rights reserved.