Laravel Eloquent Поиск нескольких слов из разных полей - PullRequest
0 голосов
/ 27 мая 2018

У меня в настоящее время есть следующий код, который работает ...

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

Он производит следующий 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 голосов
/ 27 мая 2018

Попробуйте это:

$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 голосов
/ 27 мая 2018

Чтобы получить следующий 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...