我正在使用活动Feed构建应用,就像Facebook或Instagram一样。例如,当用户上传图片时,该图片会自动在活动表中创建一个条目。上传的图片与活动之间存在多态关系。活动模型将处理以下,喜欢和其他事情。活动模型看起来像那样
活动
model_id 12
model_type picture
user_id 1313
activity_type picture_upload
如果用户决定在短时间内再次上传另一张图片,我希望合并这些与相同型号相关的类似活动,就像Instagram一样。 此活动与上传的两张图片都有关系。 为此,我在活动表中创建了一个名为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查询。我认为应该有更好的方法来做到这一点。你会怎么做?范围合并"类似的活动"检索活动是一种好习惯吗?
答案 0 :(得分:2)
就个人而言,我有一个交叉引用表,它只存储ID的关系。
parent | related
----------------
12 | 13
12 | 14
12 | 15
然后,如果用户删除了13
,14
或15
,您只需从表中删除此关系即可。
如果有人删除12
,那么棘手的部分就会出现。在这里,您必须决定如何处理它。您可以删除父亲为12的所有人,基本上是孤儿活动。或者,您可以通过一些工作来代替14
和15
与活动13
。
答案 1 :(得分:2)
我认为为活动生成组ID是个好主意,如果活动重复,您可以为其分配相同的组ID。
<强>活动强>
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语句编写方法来轻松计算它们。 这样,通过一些代码更改,您可以根据需要对不同的关系类型进行分组