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(b.created_at) 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('customers.id', '>', '0');
    $sql = '((SELECT a.* FROM customer_distribute_logs AS a,(SELECT    b.`customer_id`,MAX(b.created_at) 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), 'customers.id', '=', 'd.customer_id')
        ->select('customers.*', 'd.old_leader',`d.new_leader` 'customers.created_at as created_date',
            DB::raw("DATE_FORMAT(birthd , '%m%d ') as birthd_sort")
        );
    return $customers;
}

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值