toSearchableArray() в 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();

Но это обновляет всю запись, которая связана с идентификатором пользователя-создателя.


person Andreas    schedule 08.07.2018    source источник


Ответы (1)


Моя первоначальная рекомендация заключалась бы в том, что вы должны сохранять «Нравится» в своей собственной таблице и иметь отношение «один ко многим» между собраниями и лайками. Таким образом, вы можете легко позволить пользователям видеть, какие встречи им понравились и т. д., поскольку у вас также будет отношение «один ко многим» между вашими пользователями и их лайками. Это означает, что вам не нужно обновлять весь объект встречи для простого лайка (и, таким образом, перезаписывать исходного создателя). Вместо этого вы создаете связанный объект Like с его собственным создателем.

Поскольку вы не делаете этого таким образом и вместо этого сохраняете лайки на самих объектах встречи, вы можете сделать что-то вроде следующих строк:

В вашем классе Meeting у вас, вероятно, уже есть отношение к пользователю:

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;
}

поскольку ваш объект встречи имеет связанный объект пользователя, вы можете просто указать его для имени пользователя. Если кто-то еще обновил объект с помощью лайка, то для атрибута имени пользователя все еще будет сохранен первоначальный создатель, поскольку вы не перезаписываете его с помощью текущего пользователя, вошедшего в систему.

Надеюсь, это поможет!

person NickTr    schedule 15.07.2018