我目前有以下代码正在运行...
$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 ?)
我尝试了一些方法,但似乎无法实现。
谢谢。
获取以下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);
试试这个:
$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 ?))
从 Laravel 10.47 开始,有新方法可以简化此操作:
whereAny
whereAll
上面的代码现在可以是:
$cards = Card::whereAny(['firstname','lastname','cardset'], 'LIKE', "%$value%");