Laravel - запрос выбора базы данных с несколькими условиями - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь создать простой поисковый запрос в БД с несколькими условиями.

Я бы хотел искать в БД сообщения, проверяя теги , прикрепленные к сообщениям, и проверять поиск слов в сообщениях title .

До сих пор я сделал запрос, который проверяет несколько тегов для сообщений, но сейчас я борюсь, как проверить несколько слов в заголовке сообщения.

$search = $request['search'];
$searchArr = explode(' ',$request['search']);
$searchTitle = [];

foreach ($searchArr as $search){
    $searchTitle[] = ['title','like', "%$search%"];
}

echo Post::with(['allTags'])->whereHas('allTags', function($query) use ($searchArr) {
    for ($i=0; $i < count($searchArr); $i++) {
        if($i==0) {
            $query->Where('name', $searchArr[$i]);
        }else{
            $query->orWhere('name', $searchArr[$i]);
        }

    }
})->where(['published'=>1])->orWhere([['title','like', "%$search%"],['published','=','1']])->get();

Как видите, я использую цикл for для проверки нескольких тегов, но не могу найти способ сделать это в этой части кода ->orWhere([['title','like', "%$search%"],['published','=','1']])->get();

Может кто-нибудь сказать мне, как это сделать?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

согласно моему пониманию, вы хотите разбить слова в строке поиска, если она содержит несколько слов, как в следующем примере:

<?php
$search_term = 'test1 test2 test3';
$keywords = explode(" ", preg_replace("/\s+/", " ", $search_term));
foreach($keywords as $keyword){
 $wherelike[] = "title LIKE '%$keyword%' ";
}
$where = implode(" and ", $wherelike);

$query = "select * from table where $where";

echo $query;

и используйте метод Laravel whereRaw(), чтобы выполнить его как необработанный запрос

0 голосов
/ 04 мая 2018

Насколько я понимаю, вам нужно использовать whereRaw метод.

Будьте осторожны, это может привести к SQL-инъекции

foreach ($searchArr as $search) {
    $searchTitle[] = ['title','like', "%$search%"];
}

Вы, вероятно, должны построить SQL, а затем выполнить привязку, используя базовый объект PDO с методом whereRaw:

$searchQuery = implode(',', array_map(function($item) { return 'title like \"?\"'; }, $searchArray));

А затем в строке запроса:

...->whereHas('allTags', function($query) use ($searchQuery, $searchArray) {
    $query->whereRaw($searchQuery, $searchArray, 'or');
})

Еще проще, если вы действительно проверяете заголовок в Посте

...->whereRaw($searchQuery, $searchArray, 'or')

Также обязательно проверьте комментарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...