Laravel:创建或更新相关模型?

时间:2015-04-08 15:36:20

标签: php laravel models

请对我温柔 - 我是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();

1 个答案:

答案 0 :(得分:0)

您应该参考Laravel API Docs。我不认为他们在“常规文档”中提到这些方法,但我理解为什么你可能没有看到它。

您可以使用模型firstOrNewfirstOrCreate方法。

  

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将包含数据库中的现有模型或属性latlng分别设置为$coords[1]$coords[0]的新实例,您可以然后根据需要保存或设置更多属性值。

另一个例子:

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

$ location将包含来自数据库的现有模型或再次设置属性的新模型,除非此时模型已经写入表中(如果未找到)。