首页 > 解决方案 > 如何获得关系而不是所有关系的结果

问题描述

我需要一个与项目有“hasMany”关系的订单(表订单)。我只需要获取在其中一个项目上具有特定日期的订单,并且只需要相关项目。

例如,如果我有一个订单:订单 1 有 2 个项目,一个在 1 月 1 日创建,另一个在 12 月创建,我在 1 月 1 日搜索,我想获取订单和项目。

$order = Order::with('items')->whereHas(
  'items', function ($query) use ($dateFrom, $dateTo) {
    return $query->whereBetween('date_debut', [$dateFrom->format('Y-m-d').' 00:00:00', $dateTo->format('Y-m-d').' 00:00:00'])
      ->with([
        'titles.title',
      ]);
  })->get();

使用该代码,我总能得到订单的所有物品,而不仅仅是我想要的

标签: phplaravel

解决方案


与里面 whereHas 没有任何影响。

您应该将您的条件应用于急切负载关系本身:

$orders = Order::with(['items'=>function($query) use ($dateFrom, $dateTo){
            return $query->whereBetween('date_debut', [$dateFrom->format('Y-m-d').' 00:00:00', $dateTo->format('Y-m-d').' 00:00:00'])
                ->with(['titles.title']);
        }])->whereHas(
            'items', function ($query) use ($dateFrom, $dateTo) {
            $query->whereBetween('date_debut', [$dateFrom->format('Y-m-d').' 00:00:00', $dateTo->format('Y-m-d').' 00:00:00']);
        })->get();

请注意,如果您想要所有订单,无论它们是否有项目wherebetween,您都可以删除这些whereHas语句。


推荐阅读