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