У меня есть запрос, который должен загрузить все посты только с их английским переводом.
Если пользователь вводит ключевое слово, он возвращает только сообщение на английском языке с заголовком, содержащим это ключевое слово.
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 в круглые скобки при цепочке?






Добавьте оба условия внутри запроса 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);
}
Вы можете добавить это условие where таким же образом внутри when.
Я не понимаю. Если я делаю так, проблема та же. $query->where('post_translations.locale','=','en')->where('post_translations.title', $searchKeywords)->orWhere('post_translations.title', 'нравится' , '%' .$searchKeywords .'%');
Потому что он генерирует: ГДЕ post_translations.locale = 'en' И post_translations.title = 'О программе' ИЛИ post_translations.title как 'О программе' ограничение 20 смещение 0
Используйте его следующим образом: $query->where('post_translations.locale','=','en')->where(function ($query) use ($searchKeywords) { .title', $searchKeywords) ->orWhere('post_translations.title', 'лайк', '%' . $searchKeywords . '%'); })
Я решил с помощью этого кода:
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);
Это должно сработать, в любом случае мой запрос немного сложнее, я его обновил. У меня есть два поля поиска, $searchКлючевые слова и $searchCategory. Поэтому мне нужно сохранить условие когда.