按子孙值对子关系进行排序

时间:2018-09-20 15:17:23

标签: laravel laravel-5

我有这个票务模型:

class Ticket extends Model
{
    public function items()
    {
        return $this->hasMany('App\Models\TicketItem', 'ticket_id', 'id');
    }
}

和TicketItem模型:

class TicketItem extends Model {    
    public function product()
    {
        return $this->belongsTo('App\Models\Product');
    }
}

和产品型号:

class Product extends Model {   
    public function category()
    {
        return $this->belongsTo('App\Models\Category');
    }
}

产品有一个名为category_id的字段。

当我执行App\Models\Ticket::find(123)->load('items.product.category')时,我希望ticket.itemsticket.items.product.category_id.排序

1 个答案:

答案 0 :(得分:0)

以下应该可以解决问题:

App\Models\Ticket::find(123)->load(['items' => function($query) {
  $query->join('products', 'product_id', '=', 'products.id')
    ->orderBy('category_id', 'ASC');
})->load('items.product.category');

这将告诉Eloquent,在加载时,应应用回调中的其他条件。在这里,您可以将商品与产品结合在一起,并按 category_id 对商品进行排序。

更新:为避免列名冲突,可以对表名使用别名:

App\Models\Ticket::find(123)->load(['items' => function($query) {
  $query->from('ticket_items as tis')
    ->join('products as ps', DB::raw('its.product_id'), '=', DB::raw('ps.id'))
    ->select(DB::raw('tis.*'))
    ->orderBy('category_id', 'ASC');
})->load('items.product.category');