Как обернуть запрос Eloquent скобками, когда мы используем условные предложения в Laravel 5.7

У меня есть запрос, который должен загрузить все посты только с их английским переводом.
Если пользователь вводит ключевое слово, он возвращает только сообщение на английском языке с заголовком, содержащим это ключевое слово.

if ($searchKeywords||$searchCategory){
    $posts = Post::
        select('post_translations.post_id AS id', 'post_translations.title AS title', 'category_id', 'locale')
           ->join('post_translations', 'posts.id', '=', 'post_translations.post_id')
           ->where(‘post_translations.locale','=','en')
           ->when($searchKeywords, function ($query, $searchKeywords) {
                 return $query->where('post_translations.title', $searchKeywords)->orWhere('post_translations.title', 'like', '%' . $searchKeywords . '%');
            })
           ->when($searchCategory, function ($query, $searchCategory) {
                  return $query->where('category_id', '=', $searchCategory);
            ->paginate(20);
        }
else
    $posts = Post::select('id', 'title', 'category_id')->orderBy('title')->paginate(20);

Сгенерированный запрос таков:

SELECT `post_translations`.`post_id` AS `id`, `post_translations`.`title` AS `title`, `category_id` 
FROM `posts` inner join `post_translations` 
ON `posts`.`id` = `post_translations`.`post_id` 
WHERE `post_translations`.`locale` = 'en' 
AND `post_translations`.`title` = 'About' 
OR `post_translations`.`title` like 'About’  
LIMIT 20 OFFSET 0

Вот и верни мне все 3 поста переводы поста О.
Это из-за или где.

Как я могу изменить красноречивый запрос, чтобы сгенерировать такой запрос?

SELECT `post_translations`.`post_id` AS `id`, `post_translations`.`title` AS `title`, `category_id` 
FROM `posts` inner join `post_translations` 
ON `posts`.`id` = `post_translations`.`post_id` 
WHERE `post_translations`.`locale` = 'en' 
AND (`post_translations`.`title` = ‘About' OR `post_translations`.`title` like 'About’  )
LIMIT 20 OFFSET 0

Вопрос не является дубликатом этого, потому что у меня есть еще один уровень подзапроса. Как вы заключаете области запросов Laravel Eloquent ORM в круглые скобки при цепочке?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
0
682
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Добавьте оба условия внутри запроса where следующим образом:

if ($searchKeywords) {
    $posts = Post::select('post_translations.post_id AS id', 'post_translations.title AS title', 'category_id', 'locale')
       ->join('post_translations', 'posts.id', '=', 'post_translations.post_id')
       ->where(‘post_translations.locale','=','en')
       ->where(function ($query) use ($searchKeywords) {
             $query->where('post_translations.title', $searchKeywords)
                   ->orWhere('post_translations.title', 'like', '%' . $searchKeywords . '%');
        })
        ->paginate(20);
}

Это должно сработать, в любом случае мой запрос немного сложнее, я его обновил. У меня есть два поля поиска, $searchКлючевые слова и $searchCategory. Поэтому мне нужно сохранить условие когда.

Davide Casiraghi 14.02.2019 11:30

Вы можете добавить это условие where таким же образом внутри when.

Kamal Paliwal 14.02.2019 11:31

Я не понимаю. Если я делаю так, проблема та же. $query->where('post_translations.locale','=','en')->where('p‌​ost_translations.tit‌​le', $searchKeywords)->orWhere('post_translations.title', 'нравится' , '%' .$searchKeywords .'%');

Davide Casiraghi 14.02.2019 11:42

Потому что он генерирует: ГДЕ post_translations.locale = 'en' И post_translations.title = 'О программе' ИЛИ ​​post_translations.title как 'О программе' ограничение 20 смещение 0

Davide Casiraghi 14.02.2019 11:43

Используйте его следующим образом: $query->where('post_translations.locale','=','en')->where(fu‌​nction ($query) use ($searchKeywords) { .title', $searchKeywords) ->orWhere('post_translations.title', 'лайк', '%' . $searchKeywords . '%'); })

Kamal Paliwal 14.02.2019 11:43

Я решил с помощью этого кода:

if ($searchKeywords||$searchCategory){
    $posts = Post::
            select('post_translations.post_id AS id', 'post_translations.title AS title', 'category_id', 'locale')
            ->join('post_translations', 'posts.id', '=', 'post_translations.post_id')
            ->when($searchKeywords, function ($query, $searchKeywords) {
                return $query->where('post_translations.locale','=','en')
                             ->where(function ($query) use ($searchKeywords) { 
                                  $query->where('post_translations.title', $searchKeywords)->orWhere('post_translations.title', 'like', '%' . $searchKeywords . '%');
                              });

            })
            ->when($searchCategory, function ($query, $searchCategory) {
               return $query->where('post_translations.locale','=','en')
                            ->where(function ($query) use ($searchCategory) { 
                                $query->where('category_id', '=', $searchCategory);
                             });
            })
            ->paginate(20);
}
else
    $posts = Post::select('id', 'title', 'category_id')->orderBy('title')->paginate(20);

Другие вопросы по теме