将子选择 sql 查询转换为 laravel 查询

Posted

技术标签:

【中文标题】将子选择 sql 查询转换为 laravel 查询【英文标题】:convert subselect sql query to laravel query 【发布时间】:2018-05-30 13:28:21 【问题描述】:

我在下面有一个mysql 查询

 select * from
  ( SELECT *,(select count(*) from `comments` where parent_id=b._id) as 
  cnt FROM `comments` b )x 
  where ((x.type_user='xxxx' and (cnt>0 or x.is_starter=1)) 
  or(type_user='user' and cnt>=0)) 
  and deleted_at is null and parent_id is null  order by created_at desc

我想将其转换为 laravel 查询。这就是我尝试的方法

  $res=DB::table('comments')
        ->select(DB::raw('comments.*, (select count(*) from `comments` b where b.parent_id=comments._id) as cnt'));

        $res->where(function ($query) 
            $query->where('comments.type_user','xxxx')
            ->where(function ($query1) 
                $query1->where('cnt','>',0)
                ->orWhere('comments.is_starter',1);
            );
        )->orWhere(function($query) 
            $query
            ->where('comments.type_user','user')
            ->where('cnt', '>=',0); 
        );

导致下面的错误

SQLSTATE[42S22]:未找到列:1054 'where' 中的未知列 'cnt' 子句'

请帮忙。提前致谢

【问题讨论】:

您的原始查询有效吗? 是的。请将其转换为 laravel 查询。我是 laravel 的新手 问题是外部选择。我不知道如何将它集成到 laravel 您是否有理由不想使用 laravel eloquent 或者它也是一种选择? 【参考方案1】:

Laravel 5.6:

$res = DB::query()
    ->fromSub(function($query) 
        $query->select('*', DB::raw('(select count(*) from `comments` where parent_id=b._id) as cnt'))
            ->from('comments as b');
    , 'x');

Laravel

$res = DB::query()
    ->from(DB::raw('(SELECT *, (select count(*) from `comments` where parent_id=b._id) as cnt FROM `comments` b) x'));

【讨论】:

调用未定义的方法 Illuminate\Database\Query\Builder::fromSub() 你的 Laravel 版本是什么? laravel 版本为 5.4 你能写出完整的查询吗? 我更新了我的答案。你应该先自己试试。如果您有任何问题,我会提供帮助。

以上是关于将子选择 sql 查询转换为 laravel 查询的主要内容,如果未能解决你的问题,请参考以下文章

帮助将子查询转换为带连接的查询

将原始 SQL 转换为 Laravel 查询构建器

将 PHP SQL 转换为 Laravel 查询构建器 [重复]

如何将 sql 转换为查询生成器 laravel

将子查询转换为单个查询 Hive

将子查询转换为 JSON 性能