Laravel显示关系结果

时间:2015-12-02 21:25:11

标签: php laravel relation

我从网址获取$filter$month或两者。例如,当我想要仅显示11月的结果时,使用下面的代码一切正常。但是,如果已经设置了过滤器,那么它会显示所有结果(也来自其他月份),如果在数据库中找到了过滤器。

我想要实现的是,如果在数据库中找到了已设置的过滤器,则仅显示结果,如果已设置月份,则仅显示该特定月份的结果。

我的Section和Expense模型分别有belongsTo和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);

我在视图中的$expenses上使用foreach来显示结果。

2 个答案:

答案 0 :(得分:1)

按照你的方式,你可以用另一个覆盖一个急切的加载约束。您需要将所有检查移动到一个急切的加载约束中,如下所示:

$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 :(得分: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);

在正确的scenenario中,你应该处理内部闭包内的所有AND条件。

可以使用

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

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

查看此answer和此documentation