使用连接和排序依据时的Laravel数据库排序问题

时间:2018-09-11 15:34:20

标签: mysql laravel eloquent mariadb

我有一个正在研究的项目,并且有一个StaffCustomerSale模型。

如预期的那样,Staff可以有许多Sale,其中有一个Customer-一个Customer也可以有许多Sale

在我正在处理的视图中,我想显示属于Customer成员的所有Staff,但是只显示一次每个Customer(DISTINCT,GROUP BY?)但按最新的Sale(sale_date,DESC)的顺序排列。

我尝试了许多不同的方法来显示此内容,但是目前有以下代码:

Customer::join('sales', 'customers.id', '=', 'sales.customer_id')
->where('sales.staff_id',$id)
->orderBy('sales.sale_date', 'DESC')
->select('customers.*')
->get();

除奇数记录外(在八月中旬会有从九月开始的记录),大部分时间都在工作。这是我尝试过的其他方法:

$staff->sales()->orderBy('sale_date','DESC')->distinct('customer_id')->get();

Sale::select(DB::raw('s.*'))
->from(DB::raw('(SELECT * FROM sales WHERE staff_id = '.$id.' ORDER BY sale_date DESC) s'))
->groupBy('s.customer_id')
->orderBy('sale_date','DESC')
->get();

我并不特别介意返回Sale的集合,因为我可以修改视图以获取每个Customer的{​​{1}}

任何帮助/建议将不胜感激!

编辑:同样也注意到了,甚至也没有获得过不同的客户:(

2 个答案:

答案 0 :(得分:1)

根据joins documentation的加入功能,使用数据库而不是直接使用模型,因此请尝试用Sale::select替换DB::table('sales')

答案 1 :(得分:1)

使用修改后的withCount()通过子查询获取最新的销售记录:

 Customer::withCount(['sales as sale_date' => function($query) {
        $query->select(DB::raw('max(sale_date)'));
    }])
    ->where('sales.staff_id', $id)
    ->orderByDesc('sale_date')
    ->get();