2017-11-30 17 views
2

私はLaravel Eloquentを使用してデータベースを2回ヒットしています。私は2つのクエリの結果を1つにマージします。どのようにしてこれを単一のクエリにして、データベースに一度しかヒットしないのですか? 0 idとPARENT_IDがPARENT_IDではなくIDでソートさ0ではない行でソートさ:このクエリをどのように組み合わせることができますか?

$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を持つ行がしたいです。

答えて

1

削除条件(PARENT_ID = 0、PARENT_ID!= 0)と、最初にしてPARENT_IDで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

これは素晴らしいです。ありがとう。 – rotaercz

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); 
関連する問題