2017-02-01 2 views
2

FacebookやInstagramのように、アクティビティフィードを使用してアプリを構築しています。例えばユーザが写真をアップロードすると、この写真は自動的にアクティビティテーブルにエントリを作成する。画像のアップロードとアクティビティとの間には、多形関係があります。アクティビティモデルは、以下、好きなものなどを処理します。アクティビティモデルは、ユーザが短期間で再び別の画像をアップロードすることを決定した場合、私は同じに関連これらの同様の活動を統合したいと思いますアクティビティフィードのアクティビティをマージする

model_id  12 
model_type  picture 
user_id  1313 
activity_type picture_upload 

その

活動のように見えますモデルタイプをInstagramのように1つに変換します。 このアクティビティは両方の写真がアップロードされた関係になります。このため Iこれは完全に私が順番に活動するための方法を作成し、動作しているmultiple_idsと呼ばれ、そこに私は結果としてピクチャIDの

活性

model_id  12 
model_type  picture 
user_id  1313 
activity_type picture_upload 
multiple_ids 13,14,15 

を挿入した活動テーブルに追加フィールドを作成それらの "複数のモデル"を取得する。しかし、例えば、ユーザーがmultiple_idsフィールドに含まれるピクチャを削除することを決めた場合、multiple_idsでLIKEクエリを作成する必要があります。私はこれを行うより良い方法があるべきだと思います。あなたはどうしますか?アクティビティの取得時に「類似のアクティビティ」をマージするスコープは良い方法でしょうか?

答えて

2

個人的には、単にIDの関係を保存する相互参照テーブルがあります。

parent | related 
---------------- 
12  | 13 
12  | 14 
12  | 15 

次に、ユーザが1314または15を削除した場合、あなたは単にテーブルからこの関係を削除したいです。

誰かが12を削除すると厄介な部分が発生します。ここでは、どのように処理するかを決定する必要があります。あなたは12の親と一緒にすべてを削除することができます。これは本質的に孤児の活動であなたを助けます。または、あなたはちょっとした仕事をして1415アクティビティ13とすることができます。

2

アクティビティのグループIDを生成することをお勧めします。アクティビティが繰り返されると、同じグループIDを割り当てることができます。

活動が作成されたとき、あなたはイベントにサブスクライブすることができ、最後の5分で、このユーザーは、この活動をしたかどうかを確認

model_id  12 
model_type  picture 
user_id  1313 
activity_type picture_upload 
group_id  picture_upload_1313_14505049334 
created_at  2017-02-01 11:55:00 

活動 - そして、あなたはそれがこの上のようになります。同じグループID を割り当てますLaravel 4

Activity::creating(function($activity) { 
    $originatingActivity = Activity::where('created_at', '>', Date::subMinutes(5))->where('activity_type', $activity->activity_type)->where('user_id',$activity->user_id)->first(); 
    if ($originatingActivity) { 
    $activity->group_id = $originatingActivity->group_id; 
    } 
    else { 
    $activity->group_id = $activity->activity_type . $activity->user_id . time() 
    } 

}) 

し、コードにあなたはGROUP_IDによって活動を得ることができるので、あなたはそれが何かを破壊しない一つの活性が削除される場合、あなたはGROUPBY statemeとメソッドを書くことができます簡単に数えることができます。 このようにして、コードの変更によっては、必要に応じて異なるリレーションタイプをグループ化することができます

関連する問題