Laravel: Create or update related model?

爱⌒轻易说出口 提交于 2019-12-24 13:41:46

问题


Please be gentle with me - I'm a Laravel noob.

So currently, I loop through a load of users deciding whether I need to update a related model (UserLocation).

I've got as far as creating a UserLocation if it needs creating, and after a bit of fumbling, I've come up with the following;

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

My issue is that one the second time around, the Location may want updating and a row will already exist for that user.

Is this handled automatically, or do I need to do something different?

The code reads like it's creating a new row, so wouldn't handle the case of needing to update it?

Update - solution:

Thanks to Matthew, I've come up with the following solution;

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

回答1:


You should reference the Laravel API Docs. I don't think they mention these methods in the "regular docs" though so I understand why you may have not seen it.

You can use the models firstOrNew or firstOrCreate methods.

firstOrNew: Get the first record matching the attributes or instantiate it.

firstOrCreate: Get the first record matching the attributes or create it.

For Example:

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

In the above example, if a model with a model_id of 4 isn't found then it creates a new instance of SomeModel. Which you can then manipulate and later ->save(). If it is found, it is returned.

You can also use firstOrCreate, which instead of creating a new Model instance would insert the new model into the table immediately.

So in your instance:

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

$location will either contain the existing model from the DB or a new instance with the attributes lat and lng set to $coords[1] and $coords[0] respectively, which you can then save or set more attribute values if needed.

Another example:

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

$location will either contain the existing model from the DB or a new model with the attributes set again, except this time the model will have already been written to the table if not found.



来源:https://stackoverflow.com/questions/29519127/laravel-create-or-update-related-model

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!