В моем случае у меня есть таблица каналов, которая во многих отношениях имеет отношение к таблице категорий .
Я хочу получить каналы, в которых их категории содержат динамическое значение, например, делать запрос LIKE
по названию каждой категории. но мне нужно проверить другие столбцы канала , где указано предложение.
Это структура канала :
[ { "id": 87, "username": "ch1", "title": "ch title", "type": "channel", "members": 210424, "location": "tabriz", "created_at": "2017-05-09 01:39:44", "updated_at": "2017-05-16 17:19:28", } ]
Чтобы получить то, что я хочу, я запускаю этот запрос:
$channels = Channel::orderBy('members', 'desc') ->whereHas('categories', function ($query) use ($category) { $query->where('title', 'LIKE', '%' . $category . '%'); }) ->where([ ['visible', 1], ['title', 'LIKE', '%' . $trend . '%'], ['location', 'LIKE', '%' . $location . '%'], ['members', '>', $members]]) ->get();
Верхний запрос возвращает мне все каналы, такие как запрос без предложения whereHas
, когда я использую только «whereHas», он возвращает каналы в категории, которую я хочу!
Использую ли я неправильный синтаксис? Верно ли использовать where
и where
положения whereHas
бок о бок?
ОБНОВИТЬ:
Мне нужно сделать запрос на название канала или имя пользователя, поэтому я использую orWhere
но результат по-прежнему! он возвращает мне все каналы! как запрос без whereHas
снова. Поэтому я использую этот запрос, чтобы сделать это,
$channels = Channel::orderBy('members', 'desc') ->whereHas('categories', function ($query) use ($category) { $query->where('title', 'LIKE', '%' . $category . '%'); }) ->where([ ['visible', 1], ['title', 'LIKE', '%' . $trend . '%'], ['location', 'LIKE', '%' . $location . '%'], ['members', '>', $members]]) ->orWhere([ ['visible', 1], ['username', 'LIKE', '%' . $trend . '%'], ['location', 'LIKE', '%' . $location . '%'], ['members', '>', $members]]) ->get();
Сначала я думал, что проблема – это предложение OrderBy, как сказал @exprator, но после добавления или orWhere
я понял, что orderBy
не является моей проблемой.
Channel::whereHas('categories', function ($query) use ($category) { $query->where('title', 'LIKE', '%' . $category . '%'); })->orderBy('members', 'desc')
используйте whereHas перед order_by
->orWhere(function ($query) { $query->where('visible', '=', 1) ->where('username', 'LIKE', '%' . $trend . '%') ->where('location', 'LIKE', '%' . $location . '%') ->where('members', '>', $members); })
Я решил эту проблему, дублируя whereHas
предложение после orWhere
. Поэтому, чтобы получить каналы, которые есть в категориях, которые я хочу, я использовал этот запрос:
$channels = Channel::orderBy('members', 'desc') ->whereHas('categories', function ($query) use ($category) { $query->where('title', 'LIKE', '%' . $category . '%'); }) ->where([ ['visible', 1], ['title', 'LIKE', '%' . $trend . '%'], ['location', 'LIKE', '%' . $location . '%'], ['members', '>', $members]]) ->orWhere([ ['visible', 1], ['username', 'LIKE', '%' . $trend . '%'], ['location', 'LIKE', '%' . $location . '%'], ['members', '>', $members]]) ->whereHas('categories', function ($query) use ($category) { $query->where('title', 'LIKE', '%' . $category . '%'); }) ->get();
Может быть, это странно, но хорошо сработало!
Попробуйте использовать ->whereHas()
после ->where()
. Вам не нужно что-то дублировать нормально.
$channels = Channel::where([ ['visible', 1], ['title', 'LIKE', '%' . $trend . '%'], ['location', 'LIKE', '%' . $location . '%'], ['members', '>', $members]]) ->orWhere([ ['visible', 1], ['username', 'LIKE', '%' . $trend . '%'], ['location', 'LIKE', '%' . $location . '%'], ['members', '>', $members]]) ->whereHas('categories', function ($query) use ($category) { $query->where('title', 'LIKE', '%' . $category . '%'); }) ->orderBy('members', 'desc') ->get();