Я хочу получить все изображения, которые имеют слово в названии, в качестве одного из тегов или категории - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь добавить функцию поиска на свой веб-сайт, и я пытаюсь выполнить красноречивые запросы, которые мне нужно выполнить. В настоящее время я сделал 3 запроса, и каждый получает изображения, соответствующие определенным критериям, однако я не уверен, как объединить его в 1 запрос, который бы разбивал все изображения, которые соответствуют одному, двум или всем критериям.

$images = Image::where('name', 'like', '%'.$query.'%')->get();

Этот запрос получает все изображения с именем, похожим на искомое слово.

$images = Image::whereHas('tags', function($q) use ($query) {
        return $q->where('name', 'like', '%'.$query.'%');
    })->orderBy('created_at', 'desc')->get();

Этот запрос получает все изображения с тегом, похожим на искомое слово.

$images = Image::whereHas('category', function($q) use ($query) {
            return $q->where('name', 'like', '%'.$query.'%');
        })->orderBy('created_at', 'desc')->get();

И, наконец, этот запрос получает все изображения, которые имеют категорию, аналогичную искомому слову.

public function search($query){

    $images = Image::where('name', 'like', '%'.$query.'%')->get();

    $images = Image::whereHas('tags', function($q) use ($query) {
        return $q->where('name', 'like', '%'.$query.'%');
    })->orderBy('created_at', 'desc')->get();

    $images = Image::whereHas('category', function($q) use ($query) {
        return $q->where('name', 'like', '%'.$query.'%');
    })->orderBy('created_at', 'desc')->get();

    return view('search', ['images' => $images]);

}

Это правильный способ создания функции поиска? Могу ли я что-нибудь сделать, чтобы улучшить его? Есть ли какая-то очевидная проблема, над которой я лично мог бы наблюдать? Буду признателен за любые советы и рекомендации, поскольку считаю, что функциональность поиска важна для таких приложений CRUD, как мое.

1 Ответ

0 голосов
/ 04 ноября 2018

Объединить ограничение в один запрос:

$images = Image::where('name', 'like', '%'.$query.'%')
    ->orWhereHas('tags', function($q) use ($query) {
        return $q->where('name', 'like', '%'.$query.'%');
    })->orWhereHas('category', function($q) use ($query) {
        return $q->where('name', 'like', '%'.$query.'%');
    })->latest()
    ->get();

latest() эквивалентно orderBy('created_at', 'desc').

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