Laravel: создать или обновить связанную модель?

Пожалуйста, будь осторожен со мной — я нуб Laravel.

Поэтому в настоящее время я перебираю множество пользователей, решая, нужно ли мне обновлять связанную модель (UserLocation).

Я дошел до создания UserLocation, если он нуждается в создании, и после некоторой путаницы я придумал следующее;

$coords = $json->features[0]->geometry->coordinates;
$location = new UserLocation(['lat'=>$coords[1],'lng'=>$coords[0]]);
$user->location()->save($location);

Моя проблема в том, что во второй раз Местоположение может потребовать обновления, и для этого пользователя уже будет существовать строка.

Это обрабатывается автоматически, или мне нужно сделать что-то другое?

Код читается так, как будто он создает новую строку, так что не справится ли с необходимостью его обновления?

Обновление — решение:

Благодаря Мэтью я нашел следующее решение;

$location = UserLocation::firstOrNew(['user_id'=>$user->id]);
$location->user_id = $user->id;
$location->lat = $coords[1];
$location->lng = $coords[0];
$location->save();

1

Решение

Вы должны ссылаться на Документы API Laravel. Я не думаю, что они упоминают эти методы в «обычных документах», хотя я понимаю, почему вы, возможно, этого не видели.

Вы можете использовать модели firstOrNew или же firstOrCreate методы.

firstOrNew: Получить первую запись, соответствующую атрибутам или создать экземпляр
Это.

firstOrCreate: Получите первую запись, соответствующую атрибутам, или создайте ее.

Например:

$model = SomeModel::firstOrNew(['model_id' => 4]);

В приведенном выше примере, если модель с идентификатором model_id, равным 4, не найдена, создается новый экземпляр SomeModel, Которым можно потом манипулировать, а потом ->save(), Если он найден, он возвращается.

Вы также можете использовать firstOrCreate, который вместо создания нового экземпляра модели немедленно вставит новую модель в таблицу.

Итак, в вашем случае:

$location = UserLocation::firstOrNew(['lat'=>$coords[1],'lng'=>$coords[0]]);

$ location будет содержать существующую модель из БД или новый экземпляр с атрибутами lat а также lng установлен в $coords[1] а также $coords[0] соответственно, которые затем можно сохранить или установить дополнительные значения атрибута, если это необходимо.

Другой пример:

$location = UserLocation::firstOrCreate(['lat'=>$coords[1],'lng'=>$coords[0]]);

$ location будет содержать либо существующую модель из БД, либо новую модель с заново установленными атрибутами, за исключением того, что на этот раз модель уже будет записана в таблицу, если не найдена.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]