Где запрос после whereHas не работает так, как следует в Laravel 5.4

В моем случае у меня есть таблица каналов, которая во многих отношениях имеет отношение к таблице категорий .

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

Related of "Где запрос после whereHas не работает так, как следует в Laravel 5.4"

 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();