Laravel:获得Eloquent创建嵌套SELECT的正确方法

时间:2015-01-19 05:30:42

标签: php laravel eloquent

我试图获得雄辩的查询是

SELECT *, (SELECT COUNT(comment_id) FROM comment AS c WHERE c.approved=true AND c.blog_fk=b.blog_id) AS comment_count FROM blog AS b

这是结果

blog_id |  title            | author       | blog           | image            | tags    | created             | updated             | comment_count
--------|-------------------|--------------|----------------|------------------|---------|---------------------|---------------------|--------------
     21 | A day..           | dsyph3r      | Lorem ipsum... | beach.jpg        | symf... | 2014-12-22 19:14:34 | 2014-12-22 19:14:34 | 2
     22 | The pool ..       | Zero Cool    | Vestibulum ... | pool_leak.jpg    | pool,.. | 2011-07-23 06:12:33 | 2011-07-23 06:12:33 | 10
     23 | Misdirection...   | Gabriel      | Lorem ipsum... | misdirection.jpg | misd... | 2011-07-16 16:14:06 | 2011-07-16 16:14:06 | 2
     24 | The grid ...      | Kevin Flynn  | Lorem commo... | the_grid.jpg     | grid... | 2011-06-02 18:54:12 | 2011-06-02 18:54:12 | 0
     25 | You're either ... | Gary Winston | Lorem ipsum... | one_or_zero.jpg  | bina... | 2011-04-25 15:34:18 | 2011-04-25 15:34:18 | 2

我目前使用DB :: select(DB :: raw())来运行这可能不是正确的方法。

问题是如何正确地获得生成产生这些结果的查询的正确方法?

2 个答案:

答案 0 :(得分:4)

请改用:http://softonsofa.com/tweaking-eloquent-relations-how-to-get-hasmany-relation-count-efficiently

对于嵌套的select / join语句,您需要这样:

$sub = Comment::selectRaw('count(comment_id) as count')
       ->where('approved', '?')
       ->where('comment.blog_fk', '?')
       ->toSql();

Blog::selectRaw(DB::raw("blog.*, ({$sub}) as comment_count"))
       ->setBindings([true, DB::raw('blog.blog_id')], 'select')
       ->get();

或者只是将所有内容都放在selectRaw

答案 1 :(得分:1)

您可以使用laravel ELoquent进行预先加载 我建议你研究一下laravel关系,以充分利用laravel 顺便说一下,一旦你定义了这两个模型之间的关系,下面的代码可能适合你。

$users = Blog::with(array('Comment' => function($query)
{
    $query->
    where('approved','=',true)->
    select(DB::raw('Count(comment_id) as comment_count'));

}))->get();