Laravel Eager Loading Order按日期/其他字段和关系中的最后记录

时间:2015-04-07 10:47:12

标签: laravel eloquent eager-loading

我有3个带字段的模型

LEAD
    id
    first_name
    surname

//in lead model
public function trxn()
{
    return $this->hasMany('lead_trxn', 'lead_id', 'id');
}

LEAD_TRXN
    id
    lead_id
    create_datetime
    expiration_datetime
    status

//in lead_trxn model
public function detail()
{
    return $this->hasMany('lead_trxn_details', 'lead_trxn_id', 'id');
}

LEAD_TRXN_DETAILS
    id
    lead_trxn_id
    product_id
    create_datetime
    status

我有这个使用Eager loading

来检索记录
$leads = Lead::with(
                    array
                         (
                             'trxn' => function($qry)
                             {
                                 $qry->with(
                                               array
                                               (
                                                   'details'
                                                   //i need the last inserted product here
                                               )
                                           );

                                  //i need to order it by expiration date
                                  //$qry->orderBy('expiration_date');
                             }
                         )
                   )->get();

问题1: 我怎样才能在它的动态过滤器中按到期日期或在lead_trxn中的create_datetime对其进行排序?这意味着,如果我将数据绘制成表格,然后单击表格的标题,它将根据我点击的标题对记录进行排序。

问题2: 如何在lead_trxn_details中插入最后一个product_id?

非常感谢您的帮助。谢谢。

1 个答案:

答案 0 :(得分:-1)

由于您从用户那里获得了列顺序和方向,因此您需要将列和方向都传递给查询。因此,您可以在闭包内使用orderBy函数扩展查询。

   $leads = Lead::with(array( 'trxn' => function($qry) use($orderByColumn, $direction) {
      $qry->orderBy($orderByColumn, $direction)
        ->with( array ( 'details' => function($q) {
            $q->orderBy('create_datetime', 'desc')->first(); // get the latest inserted product
          })
      );
    }
  )
 )->get();