1

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?

2 Answers 2

3

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);
}
Sign up to request clarification or add additional context in comments.

1 Comment

Sir, you are a genius! It's working exactly the way i want. Thank you :)
0

You could also use these Laravel helpers data_fill() or data_set().

Other doted notation functions are listed here.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.