我正在使用Laravel Eloquent两次点击数据库。我将2个查询的结果合并为一个。如何将其转换为单个查询,以便只访问数据库一次?
$openers = Comments::select('id', 'parent_id', 'opener_id', 'topic', 'username', 'comment', 'upvotes', 'created_at', 'updated_at', 'deleted_at')
->where('topic', '=', $topic)
->where('parent_id', '=', 0)
->orderBy('id')
->orderBy('updated_at', 'desc')
->get();
$replies = Comments::select('id', 'parent_id', 'opener_id', 'topic', 'username', 'comment', 'upvotes', 'created_at', 'updated_at', 'deleted_at')
->where('topic', '=', $topic)
->where('parent_id', '!=', 0)
->orderBy('parent_id')
->orderBy('updated_at', 'desc')
->get();
$comments = $openers->merge($replies);
基本上我希望带有parent_id:0的行按id排序,而parent_id不是0的行要按parent_id排序,而不是按id排序。
答案 0 :(得分:1)
删除条件(parent_id = 0,parent_id!= 0)并添加条件顺序首先对所有注释进行排序,然后对所有回复进行排序,按ID排序注释并按parent_id回复
的另一个条件顺序$results = Comments::select(
'id', 'parent_id', 'opener_id', 'topic', 'username', 'comment', 'upvotes', 'created_at', 'updated_at', 'deleted_at',
DB::raw("CASE WHEN parent_id = 0 THEN 'Comments' ELSE 'Replies' END as comment_type")
)
->where('topic', '=', $topic)
->orderByRaw('parent_id = 0 DESC')
->orderByRaw('CASE WHEN parent_id = 0 THEN id ELSE parent_id END ASC')
->orderBy('updated_at', 'desc')
->get();
答案 1 :(得分:0)
我知道你弄清楚其他事情,因为在基本查询中你实际上已经可以获得你的问题了。
或者如果你想做一些复杂的查询,但你有关于如何通过ORM方法做到这一点的问题。您可以通过在数据库中创建“VIEW”表来创建模型技巧,然后在该VIEW中使用表中的相同列或添加/删除列来执行复杂查询! :)
你可以做这样的事情,
在SQL数据库中
CREATE VIEW `sample_database`.`view_comment` AS
SELECT *, (SELECT some_field FROM other_table) as extra_field FROM comment
WHERE (some_field = 'SOME_CONDITION_ONLY') AND
some_date BETWEEN 'FROM_DATE' AND 'END_DATE'
然后在您的Php laravel代码中,您可以创建一个'ViewComment'模型,然后您可以进行类似的查询。
ViewComment::where('some_field','YOUR_CONDITION')->get(); //or
ViewComment::paginate(10);