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对象的 ,现在不怎么好看,但可以满足我需求,先这样,下次想出来在改进