Skip to main content
It is possible to create a data object from a model. Let’s say we have the following model:
It has the following columns in the database:
  • id
  • first_name
  • last_name
  • created_at
  • updated_at
We can create a data object from this model like this:
We now can create a data object from the model like this:

Casts

A model can have casts, these casts will be called before a data object is created. Let’s extend the model:
Within the database the new column will be stored as a JSON string, but in the data object we can just use the array type:

Attributes & Accessors

Laravel allows you to define attributes on a model, these will be called before a data object is created. Let’s extend the model:
We now can use the attribute in the data object:
Remember: we need to use the snake_case version of the attribute in the data object since that’s how it is stored in the model. Read on for a more elegant solution when you want to use camelCase property names in your data object.
It is also possible to define accessors on a model which are the successor of the attributes:
With the same data object we created earlier we can now use the accessor.

Mapping Property Names

Sometimes you want to use camelCase property names in your data object, but the model uses snake_case. You can use a MapInputName to map the property names:
An even more elegant solution would be to map every property within the data object:

Relations

Let’s create a new model:
Which has the following columns in the database:
  • id
  • artist_id
  • title
We update our previous model as such:
We can now create a data object like this:
And update our previous data object like this:
We can now create a data object with the relations like this:
When you’re not loading the relations in advance, null will be returned for the relation.

Automatic Relation Loading

It is however possible to load the relation on the fly by adding the LoadRelation attribute to the property:
Now the data object with relations can be created like this:
We even eager-load the relation for performance, neat!

Be Careful with Automatic Loading of Relations

Let’s update the SongData class like this:
When we now create a data object like this:
We’ll end up in an infinite loop, since the SongData class will try to load the ArtistData class, which will try to load the SongData class, and so on.

Missing Attributes

When a model is missing attributes and preventAccessingMissingAttributes is enabled for a model the MissingAttributeException won’t be thrown when creating a data object with a property that can be null or Optional.