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

时间:2018-05-27 07:03:18

标签: laravel eloquent

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

$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 ?)

我尝试过几件事,但似乎无法得到它。

感谢。

2 个答案:

答案 0 :(得分:3)

获取以下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);

答案 1 :(得分:1)

试试这个:

$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 ?))