一个用户可以创建,编辑和删除模型。所有其他用户也可以更新该模型(通过喜欢)。现在,当不是条目创建者的用户更新模型时,创建者将被更新它的人覆盖。
基本上,将数据推入Algolia索引时会发生以下情况:
public function toSearchableArray()
{
$user = \Auth::user();
$meetingData = array(
'username' => $user->name,
...
);
return $meetingData;
}
当记录由创建者以外的其他用户更新时,$ user不是创建者,而是更新记录的用户。这样,创建者将被覆盖,这是我需要避免的。
是否可以仅更新索引记录中的单个值,而不更新整个记录?我可以看到的更新模型的唯一方法是在控制器中执行以下操作:
$meeting = Meet::find($id);
$meeting->interests = implode(',', $currentLikesArray);
$meeting->save();
但这会更新整个记录,并与创建者用户ID固定在一起。
答案 0 :(得分:0)
我最初的建议是,您应该在自己的表中保存“喜欢”,并在“会议”和“喜欢”之间建立一对多的关系。这样,您就可以轻松地使用户看到他们喜欢的会议等,因为您的用户和他们的“喜欢”之间也存在一对多的关系。 这样做意味着您不必为简单的“赞”更新整个会议对象(因此可以覆盖原始创建者)。相反,您可以使用自己的创建者创建一个相关的Like对象。
由于您未采用这种方式,而是将喜欢存储在会议对象本身上,因此您可以按照以下方式进行操作,
在您的Meeting类中,您大概已经与某个用户建立了联系:
public function user()
{
return $this->belongsTo(User::class);
}
使用上述方法,在用于创建会议的控制器功能中,您将当前登录的用户保存为会议的创建者,例如
$meeting->user_id = $request->user()->id;
有了这种关系,我们现在可以访问与会议相关的User对象,因此,当您进入可搜索数组设置时,您可以执行以下操作:
public function toSearchableArray()
{
$meetingData = $this->toArray();
$meetingData['username'] = $this->user->name;
...
return $meetingData;
}
由于您的会议对象具有相关的用户对象,因此您可以仅将其引用为用户名。如果其他人已使用“喜欢”更新了该对象,则仍将保存为username属性的原始创建者,因为您不会用当前登录的用户覆盖该对象。
希望有帮助!