0

一个用户可以创建、编辑和删除模型。所有其他用户也可以更新该模型(通过喜欢它)。现在,当不是条目创建者的用户更新模型时,创建者会被更新它的用户覆盖。

基本上,这就是将数据推送到 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 不同。

4

1 回答 1

0

我最初的建议是您应该将“赞”保存在他们自己的表中,并在会议和赞之间建立一对多的关系。这样,您可以轻松地让用户查看他们喜欢的会议等,因为您的用户和他们的喜欢之间也将建立一对多的关系。这样做意味着您不必为简单的 Like 更新整个会议对象(从而覆盖原始创建者)。相反,您使用自己的创建者创建一个相关的 Like 对象。

由于您没有这样做,而是将喜欢存储在会议对象本身上,您可以按照以下方式执行一些操作,

在您的会议课程中,您可能已经与用户建立了关系:

public function user()
{
   return $this->belongsTo(User::class);
}

有了上述内容,在用于创建会议的控制器功能中,您将当前登录的用户保存为会议的创建者,例如

$meeting->user_id = $request->user()->id;

有了这种关系,我们现在可以访问与会议相关的用户对象,所以当你来到可搜索的数组设置时,你可以这样做:

public function toSearchableArray()
{
    $meetingData = $this->toArray();

    $meetingData['username'] = $this->user->name;
    ...

    return $meetingData;
}

由于您的会议对象有一个相关的用户对象,您可以只为用户名引用它。如果其他人使用 Like 更新了对象,那么它仍然是原始创建者,将被保存为 username 属性,因为您不会用当前登录的用户覆盖它。

希望有帮助!

于 2018-07-15T04:52:17.393 回答