请对我温柔 - 我是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();
答案 0 :(得分:0)
您应该参考Laravel API Docs。我不认为他们在“常规文档”中提到这些方法,但我理解为什么你可能没有看到它。
您可以使用模型firstOrNew
或firstOrCreate
方法。
firstOrNew:获取与属性匹配的第一条记录或实例化 它
firstOrCreate:获取与属性匹配的第一条记录或创建它。
例如:
$model = SomeModel::firstOrNew(['model_id' => 4]);
在上面的示例中,如果找不到model_id为4的模型,则会创建SomeModel
的新实例。然后您可以操作,然后->save()
。如果找到,则返回。
您也可以使用firstOrCreate
,而不是创建新的Model实例,而是立即将新模型插入表中。
所以在你的实例中:
$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将包含来自数据库的现有模型或再次设置属性的新模型,除非此时模型已经写入表中(如果未找到)。