Результаты отображения отношения Laravel

С URL я получаю либо $filter, $month или оба. Когда я, например, хочу показать только результаты за ноябрь, все работает нормально, используя код ниже. Но когда фильтр установлен ALSO, он показывает все результаты (также за другие месяцы), если фильтр был найден в базе данных.

Чего я хочу добиться, так это показывать только результаты, если установленный фильтр был найден в базе данных, И если установлен месяц, также показывать только результаты этого конкретного месяца.

Мои модели Разделов и Расходов имеют отношение ownTo и hasMany соответственно.

$query = Section::query();

Если фильтр был установлен:

    if ($filter !== 'false') {
$query->with(['expenses' => function ($query) use ($month) {
$query->where('date', 'LIKE', '%2015-' . Carbon::parse($month)->format('m') . '%');
}]);
}

Если был установлен месяц:

    if ($month !== 'false') {
$query->with(['expenses' => function ($query) use ($filter) {
$query->where('type', '=', $filter);
}]);
}

Я также попробовал следующий код:

    if ($filter !== 'false') {
$query->with('expenses')->whereHas('expenses', function($query) use ($filter) {
$query->where('type', '=', $filter);
});
}

if ($month !== 'false') {
$query->with('expenses')->whereHas('expenses', function($query) use ($month) {
$query->where('date', 'LIKE', '%2015-' . Carbon::parse($month)->format('m') . '%');
});
}

$expenses = $query->orderBy('section', 'asc')->paginate(25);

Я использую foreach на $expenses на мой взгляд, для отображения результатов.

0

Решение

Имея то, что у вас есть, вы перезаписываете одно нетерпеливое ограничение загрузки другим. Вам нужно переместить все ваши чеки в одно ограничение загрузки, например:

$query->with(['expenses' => function ($q) use ($month, $filter) {
if ($month !== 'false') {
$q->where('date', 'LIKE', '%2015-' . Carbon::parse($month)->format('m') . '%');
}
if ($filter !== 'false') {
$q->where('type', '=', $filter);
}
}]);
1

Другие решения

Вам нужно объединить оба, иначе последний будет портить состояние, установленное первой красноречивой моделью.

Для быстрого исправления и понимания происходящего попробуйте:

   if ($filter !== 'false') {
$query = $query->with('expenses')->whereHas('expenses', function($query) use ($filter) {
$query->where('type', '=', $filter);
});
}

if ($month !== 'false') {
$query = $query->with('expenses')->whereHas('expenses', function($query) use ($month) {
$query->where('date', 'LIKE', '%2015-' . Carbon::parse($month)->format('m') . '%');
});
}

$expenses = $query->orderBy('section', 'asc')->paginate(25);

В правильном сценарии вы должны обрабатывать все условия И внутри внутреннего замыкания.

это можно сделать с помощью

$query->where(condition1);
$query->where(condition2);

или же

$query->where(condition1)
->where(condition2);

Взгляни на это ответ и это документация

1

По вопросам рекламы [email protected]