laravel 数据库leftjoin的类似问题解决

解决类似问题:如

一张客户表,一张客户历史所属领导的表,在现在展示客户信息,要展示每条客户现在所属领导和上次所属领导

客户表                                                                                             客户历史领导表

id      name    sex  age                                                      id       new_leader     old_leader    customer_id     created_at

1        张三     男     18                                                       1          王总                李总                1                     2020-03-19

2       李四      女     19                                                       2          张总                王总                1                     2020-03-22

3         王总                 李总                2                     2020-03-21

本来一开始我想历史客户表添加数据时候就删除上一条记录,保存一条新的记录,当时日后如果要展示客户有多少个历史领导就不好办啦,客户也不多,所以这么写啦

SELECT
`customers`.*, `d`.`old_leader`,`new_leader `
`customers`.`created_at` AS `created_date`,
DATE_FORMAT(birthd, '%m%d ') AS birthd_sort
FROM
`customers`
LEFT JOIN (
SELECT
a.*
FROM
customer_distribute_logs AS a,
(
SELECT
b.`customer_id`,
MAX() AS `created_at`
FROM
customer_distribute_logs AS b
GROUP BY
b.`customer_id`
) AS c
WHERE
a.`created_at` = c.`created_at`
AND a.customer_id = c.customer_id

) as d ON `customers`.`id` = `d`.`customer_id`
WHERE
`customers`.`id` > 0
AND `customers`.`deleted_at` IS NULL

上面原生的sql 语句,

下面 laravel项目中也是主要使用原生sql,因为laravel 的orm 高级语法没吃透,不会写

public function getQuery()
{
    $customers = (new Customer)->on('mysql-slave')->where('', '>', '0');
    $sql = '((SELECT a.* FROM customer_distribute_logs AS a,(SELECT    b.`customer_id`,MAX() AS `created_at`FROM
         customer_distribute_logs AS b GROUP BY    b.`customer_id`)AS c WHERE a.`created_at`=c.`created_at` AND a.customer_id = c.customer_id) as d)';

    $customers = $customers->leftJoin(DB::Raw($sql), '', '=', '')
        ->select('customers.*', '',`` 'customers.created_at as created_date',
            DB::raw("DATE_FORMAT(birthd , '%m%d ') as birthd_sort")
        );
    return $customers;
}

方法来获取model对象的 ,现在不怎么好看,但可以满足我需求,先这样,下次想出来在改进

THE END