Пожалуйста, будь осторожен со мной — я нуб 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();
Вы должны ссылаться на Документы 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 будет содержать либо существующую модель из БД, либо новую модель с заново установленными атрибутами, за исключением того, что на этот раз модель уже будет записана в таблицу, если не найдена.
Других решений пока нет …