Laravel Scout中的toSearchableArray()覆盖所有者

时间:2018-07-08 08:57:59

标签: laravel-5.4 algolia laravel-scout

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

基本上,将数据推入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固定在一起。

1 个答案:

答案 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属性的原始创建者,因为您不会用当前登录的用户覆盖该对象。

希望有帮助!