I think about dynamic model creation or updating an model.
Let's assume i have an array like this:
$data = array(
'first_name' => 'Max',
'last_name' => 'Power',
'invoiceAddress.city' => 'Berlin',
'invoiceAddress.country_code' => 'DE',
'user.status_code' => 'invited'
);
Now i would like to iterate that array, and write the data to an model, where the dot notation tells me that i must write to an relation.
Normal code:
$model->first_name = $data['first_name'];
$model->last_name = $data['last_name'];
$model->invoiceAddress->city = $data['invoiceAddress.city'];
and so on.
I would prefer a more dynamic way:
foreach($data as $key => $value){
$properties = explode('.',$key);
//Now the difficult part
$model[$properties[0]][$properties[1]] = $value;
//Would work for invoiceAddress.city,
//but not for first_name
}
Here is the problem, that i don't know how many properties the explode will create. Is there a way to solve such problem in a dynamic way?
You could use the Illuminate\Support\Arr
helper from Laravel like this:
foreach($data as $key => $value) {
Arr::set($model, $key, $value);
}
It works because the Arr
class uses dot notation to access the properties like:
Arr::get($model, 'invoiceAddress.country_code');
Is equivalent to:
$model['invoiceAddress']['country_code'];
If you prefer to use cleaner helper:
foreach($data as $key => $value) {
array_set($model, $key, $value);
}