2017-10-15 7 views
1

こんにちは、私は多くのユーザーデータがいくつかのモデルの別々のテーブルに格納されているLaravelのアプリケーションを持っています。アクティビティフィードを作成する必要があります。これは、さまざまなデータを日付ごとに並べ替えることを意味します。Laravel Eloquentアクティビティフィードのクエリを組み合わせる

2つのモデル、CommentLikeがあるとします。

私は両方の日付を組み合わせたフィードが必要です。 merge()は、同じidを持つ可能性があるため、オプションではありません。

私はUNIONでしたが、私の問題は何から何が来たのか分かりません。

私はこのようになりますテーブルを好き:

+------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+------------+------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| user_id | int(11)   | NO |  | NULL |    | 
| asset_id | int(11)   | NO |  | NULL |    | 
| created_at | timestamp  | YES |  | NULL |    | 
| updated_at | timestamp  | YES |  | NULL |    | 
+------------+------------------+------+-----+---------+----------------+ 

私のコメントのテーブルには、次のようになります。私はちょうど組合の2つのクエリは、私は彼らが異なっているだけ知っているかどう

+------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+------------+------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| asset_id | int(11)   | NO |  | NULL |    | 
| content | longtext   | NO |  | NULL |    | 
| user_id | int(11)   | NO |  | NULL |    | 
| created_at | timestamp  | YES |  | NULL |    | 
| updated_at | timestamp  | YES |  | NULL |    | 
+------------+------------------+------+-----+---------+----------------+ 

私の問題があります他のモデル(Blurbなど)にある可能性があるcontent列の存在に基づいています。

どこ属するものをまっすぐに保ちながら、私の活動のフィードに私が言いたいので、基本的には、どのように私は、モデル間で複数のクエリを得るか、10分前に、あなたがコメントし、5分前、あなたが気に入っなど

私は非効率のために複数のクエリを実行したくないので、私はすべてのアクティビティ(好きなものやコメントなど)を1つのテーブルに保存したくありません。列の名前を変更するのではなく、クエリの目的でクエリを使用してデータを挿入するために使用できるエイリアスがありますか?たとえば、コメントの選択によって一時的なフィールドに「コメント」が追加され、

$data->type?私はすべてのテーブルに型を入れることができましたが、私はスペースが不必要に取られてしまいました。明らかに私はコメントがコメントテーブルであればそれが私の唯一のクエリーだと知っていますが、今は私のことを考え直しています私は複数のテーブルにまたがる1つのクエリが必要です。

+0

好きなコメントとコメントの関係を作成しましたか? – usrNotFound

+0

@usrNotFoundいいえ...すべきですか? –

+0

ユーザーがコメントを気に入っているかどうかはどうでしょうか。私はユーザーがいることを見ることができますが、コメントをどのようにタックしますか? – usrNotFound

答えて

1

:(未テスト)

SELECT likes.*, '' AS content, 'like' AS type 
FROM likes 
WHERE likes.user_id = 1 
UNION 
SELECT comments.*, 'comment' AS type 
FROM comments 
WHERE likes.user_id = 1 
ORDER BY created_at DESC 

Laravelのコードのようになります。

$userId = Auth::id(); //or whatever you want. 
    $activity = DB::table('comment as ac') 
    ->select(DB::raw('ac.user_id , ac.asset_id , ac.comment , ac.created_at , ac.updated_at , "comment" as activity_type')) 
    ->where("ac.user_id", $userId) 
    ->union(
    DB::table('like as al') 
    ->select(DB::raw('al.user_id , al.asset_id , NULL as comment , al.created_at , al.updated_at , "like" as activity_type')) 
    ->where("al.user_id", $userId) 
    ) 
    ->latest() 
    ->get(); 
+1

ありがとう私は本当に感謝します:) –

+0

あなたの歓迎 - @AkshayPrabhakar –

1

クエリを実行するときは、テーブル名に基づいて追加の生の値を選択します。例えば、生のSQLに:あなたは、ユーザーのアクティビティフィードを取得するには、次のコードを使用することができます

$activity = DB::table('comments') 
    ->select("comments.*, 'comment' AS type") 
    ->where('comments.user_id', $user->id) 
    ->union(
     DB::table('likes') 
      ->select("likes.*, '' AS content, 'like' AS type") 
      ->where('likes.user_id', $user->id) 
    ) 
    ->orderBy('created_at', 'ASC') 
    ->get(); 
関連する問題