Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel:创建嵌套选择的正确方法_Php_Laravel_Eloquent - Fatal编程技术网

Php Laravel:创建嵌套选择的正确方法

Php Laravel:创建嵌套选择的正确方法,php,laravel,eloquent,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 | create

我试图雄辩地提出的问题是

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())来运行它,这可能不是正确的方法


问题是,获得eloquent以生成生成这些结果的查询的正确方法是什么?

您可以将laravel eloquent与渴望加载一起使用 我建议你研究一下拉维的关系,充分利用拉维的优势 顺便说一下,一旦定义了这两个模型之间的关系,下面的代码可能适合您

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

}))->get();
改用这个: 对于嵌套的
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();

或者干脆把所有的东西都放进
选择raw

我的答案应该能帮到你。正如我在评论中提到的,明天我将提供一些更新的代码,这将允许您向count语句添加约束(例如,您的“approved=true”)。但是,这确实需要正确设置关系。@patricus你太努力了,最好读一下@JarekTkaczyk,这取决于需要什么。我当然喜欢你使用人际关系的方法,也会在其他情况下使用这种方法,但它并不能完全回答问题。在某些情况下,可能需要将关系的计数添加到初始SQL语句中,而不仅仅是在加载模型后使计数随时可用。例如,db server根据计数对结果进行排序,如我在上面的评论中提到的datatables问题。@patricus Yep,这是不同的情况,只与datatables(或一般按关系排序)相关,而这里不是这种情况。@JarekTkaczyk不,按计数排序这里不是这种情况。然而,我们从这个问题中所知道的是,用户希望将计数作为初始SQL语句的一部分。如果这是一个必须遵循的约束,那么您的解决方案将不起作用。如果这是一个可以放松的约束,那么您的解决方案是很好的。Closre,但您也需要选择
外键
,否则它将不起作用。只需遵循表中的命名约定即可。不,它与命名无关。读这个