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,但您也需要选择外键
,否则它将不起作用。只需遵循表中的命名约定即可。不,它与命名无关。读这个