如何组合此查询?

时间:2017-11-30 13:38:14

标签: php mysql laravel eloquent

我正在使用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排序。

2 个答案:

答案 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)

我知道你弄清楚其他事情,因为在基本查询中你实际上已经可以获得你的问题了。

Sample query

或者如果你想做一些复杂的查询,但你有关于如何通过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);