【问题标题】:toSearchableArray() in Laravel Scout overwrites ownerLaravel Scout 中的 toSearchableArray() 覆盖所有者
【发布时间】:2018-07-08 08:57:59
【问题描述】:

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

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

【问题讨论】:

    标签: laravel-5.4 algolia laravel-scout


    【解决方案1】:

    我最初的建议是,您应该将“赞”保存在他们自己的表格中,并在“会议”和“赞”之间建立一对多的关系。这样,您可以轻松地让用户查看他们喜欢的会议等,因为您的用户和他们的喜欢之间也将建立一对多的关系。 这样做意味着您不必为简单的 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 属性,因为您不会用当前登录的用户覆盖它。

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-23
      • 2016-04-13
      • 2014-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      相关资源
      最近更新 更多