【问题标题】:Laravel order by a nested eager load relationshipLaravel 通过嵌套的急切加载关系排序
【发布时间】:2017-03-01 03:44:48
【问题描述】:

首先,我尝试查看this,但我无法让解决方案发挥作用,因为它涉及数据透视表,而我的却没有。我的大脑无法从那个解决方案中抽象出解决方案。

我有这个问题:

$orderLines = PurchasingOrderLine::where('season_id', '=', $seasonRecID)
        ->with('factory')
        ->with('purchasingFactoryDates.milestone')
        ->with('divergedColors.purchasingColorDates.milestone')
        ->get();

所以关系很大。

我想按milestone 的“数字”属性对purchasingFactoryDates 进行排序。

这是此查询的 JSON 响应示例(示例)..

  {
    id: 1,
    season_id: 258,
    factory_id: 38,
    archived: 0,
    created_at: "2016-10-03 00:00:00",
    updated_at: "2016-10-04 00:00:00",
    factory: {
       ID: 38,
       name: "testfac",
       address: "testadrr",
       postCode: "",
       city: "Foo",
       countryID: 27,
       podID: 2,
       warehouse_id: 3,
       paymentTermID: 11,
       factoryCode: "Bazz",
       active: 1
    },
    purchasing_factory_dates: [
      {
        id: 1,
        purchasing_order_line_id: 1,
        milestone_id: 1,
        milestone_date: "1993-10-22 19:15:51",
        milestone_status_id: 2,
        created_at: "2016-10-04 07:38:30",
        updated_at: "2016-10-18 19:15:51",
        milestone: {
          id: 1,
          name: "test1",
          description: null,
          number: 1,
          created_at: "-0001-11-30 00:00:00",
          updated_at: "-0001-11-30 00:00:00"
        }
      },
    .........

关于如何做到这一点的任何想法?我不希望整个关系按Milestone.number 排序,只按purchasingFactoryDates

【问题讨论】:

标签: php laravel laravel-5


【解决方案1】:

最简单的方法是像这样加入查询:

$orderLines = PurchasingOrderLine::where('season_id', '=', $seasonRecID)
    ->select('purchasing_order_lines.*')
    ->join('purchasing_factory_dates', 'purchasing_factory_dates.purchasing_order_line_id', '=', 'purchasing_order_lines.id')
    ->join('milestone', 'purchasing_factory_dates.milestone_id', '=', 'milestone.id')
    ->with('factory')
    ->with('purchasingFactoryDates.milestone')
    ->with('divergedColors.purchasingColorDates.milestone')
    ->groupBy('purchasing_order_lines.id')
    ->orderBy('milestone.number')
    ->get();

【讨论】:

  • 这是迄今为止我最喜欢的解决方案,因为它仍然带来了里程碑和 FactoryDates。感谢您的解决方案。
  • 等等。这不是按 Milestones.number 排序的吗?我有 1、3、10、2 作为里程碑编号。 :(
  • 它似乎仍然在purching_factory_dates.id之后排序
【解决方案2】:

那是Constraining eager loading

$orderLines = PurchasingOrderLine::with('purchasingFactoryDates'=>function($query)
                            {
                              $query->with(['milestone'=>function($query)
                                   {
                                      $query->orderBy('number');
                                    }]);
                            }]);

【讨论】:

  • 可以把它放在我正在调用的所有其他“with”方法的中间吗?
  • 好吧,但这只会对关系中的里程碑进行排序,而不是按里程碑的编号对每个记录进行排序
【解决方案3】:

我认为这可能是您想要的,与您正在查看的其他答案相匹配。

$orderLines = PurchasingOrderLine::where('season_id', '=', $seasonRecID)
    ->with('factory')
    ->with(['purchasingFactoryDates' => function($q) {
        $q->select('purchasingFactoryDates.*')->join('milestone', 'purchasingFactoryDates.milestone_id', '=', 'milestone.id')->orderBy('milestone.number');
    }, 'purchasingFactoryDates.milestone'])
    ->with('divergedColors.purchasingColorDates.milestone')
    ->get();

【讨论】:

  • 这不按里程碑编号排序。这对我来说仍然是按 purchase_factory_date id 排序的。
  • 如果我删除了->with('purchasingFactoryDates.milestone'),这将正确排序。不知何故,这会覆盖排序?所以从这个意义上说,我没有得到结果中的里程碑,但是purching_order_lines 排序正确?
猜你喜欢
  • 2012-12-11
  • 1970-01-01
  • 2014-12-28
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
相关资源
最近更新 更多