下面这段sql如何用laravel表示呢?

select temp.* FROM 
(select uc.circle_id, cas.id as statistic_id, cas.created_at FROM circle JOIN user_circle as uc ON circle.id = uc.circle_id 
LEFT JOIN circle_activity_statistics as cas ON uc.circle_id = cas.circle_id WHERE circle.type != 0 and 
uc.user_id = 39471 )
 as temp 
WHERE DATE_FORMAT(created_at,'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d') OR ISNULL(created_at);

不希望用这种方式:

$query = DB::select("select temp.* FROM (select uc.circle_id, cas.id as statistic_id, cas.created_at FROM circle 
            JOIN user_circle as uc ON circle.id = uc.circle_id 
            LEFT JOIN circle_activity_statistics as cas ON uc.circle_id = cas.circle_id WHERE circle.type != 0 and uc.user_id = 39471 ) as temp 
            WHERE DATE_FORMAT(created_at,'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d') OR ISNULL(created_at)");
阅读 4.2k
5 个回答

我的原则是,普通的单表sql用ORM,不仅省事,而且带来很多的ORM对象的方法可以使用。但是以上如此复杂的SQL还是建议原生,你用ORM也不好组织,而且一旦有些变动,改起来也费劲

个人喜欢用原生的,不喜欢ORM。其实原生SQL就很好了。

这个sql太多内容如果用orm你会发现代码并不是很简洁,连缀一大堆,调试起来特别麻烦,这么长的sql,我一般直接写原生。

子查询中有左链接,我觉得你要优化写法,不要这样一条sql去处理比较好

用laravel就推荐使用ORM,左联接可以用关联关系去实现。

上面写的有点问题不需要isnull('created_at'),最终如下:

public function getCircleStatisticInfo()
    {
        $userId = $this->uid;
        $now = DateUtil::now()->format(DateUtil::dayFormat);
        return UserCircle::join('circle', function ($join) use ($userId) {
            $join->on('circle.id', '=', 'user_circle.circle_id')->where('user_circle.user_id', '=', $userId)->where('circle.type', '<>', Circle::CIRCLE_TYPE_DELETE);
        })->leftJoin('circle_statistics as cs', function ($join) use ($now) {
            $join->on('user_circle.circle_id', '=', 'cs.circle_id')->where('cs.statistic_at', '=', $now);
        })->select('user_circle.circle_id', 'cs.id as statistic_id')
          ->get();
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题