Laravel Eloquent在WhereHas中无效

时间:2017-10-14 05:13:58

标签: php laravel laravel-5

我试图显示当天的所有营业地点营业时间,如果该地点没有在数据库中列出小时数,我想要显示它但是为空。

示例:

Business 1: 10:00 am - 5:00 pm
Business 2: 10:00 am - 9:00 pm
Business 3: Closed (null)
Business 4: 10:00 am - 5:00 pm

我遇到的问题是在控制器中。它没有显示带有whereHas子句的空值。

$Locations = Locations::with('StoreHours', 'Managers', 'ShiftLeads')
                ->doesntHave('StoreHours')->orWhereHas('StoreHours', function ($query) {
                    $query->where('opening_time','>=', date('Y-m-d') . ' 00:00:00');
                    $query->where('opening_time','<=', date('Y-m-d') . ' 23:59:59');
                })
            ->get();

唯一显示的数据是任何商店从未有过商店营业时间。如果没有小时,我如何显示所有商店并获得空?

1 个答案:

答案 0 :(得分:1)

您的查询存在的问题是,不会选择今天以外任何一天的营业时间的地点。

在我看来,无论是否有营业时间,您都想要所有地点。只需从查询中删除商店营业时间关系的限制即可。这将为您提供所有位置,然后您的视图可以确定今天是否有营业时间显示。

修改

根据你的评论,我认为你真正想做的是将急切加载的商店营业时间限制在今天的那几个小时,这样你就不会加载一堆你不关心的营业时间。您可以通过调整传递给with()方法的参数来实现。您的代码看起来像:

$locations = Locations::with([
        'Managers',
        'ShiftLeads',
        'StoreHours' => function ($query) {
            return $query
                ->where('opening_time', '>=', date('Y-m-d') . ' 00:00:00')
                ->where('opening_time', '<=', date('Y-m-d') . ' 23:59:59');
        }
    ])
    ->get();

现在,只有那些与闭包相匹配的商店营业时间才会被急切地加载到每个地点。您可以阅读有关constraining eager loading in the documentation here.

的更多信息

另一个选择是创建第二个关系,该关系仅加载今天的商店营业时间,并急切加载该关系而不是整个商店营业时间关系。如果你只是在一个地方这样做,额外的工作可能不值得,但如果你需要这个逻辑,你可能想要考虑这个。