12 Hidden Features of Laravel Eloquent

12 Hidden Features of Laravel Eloquent

Laravel Eloquent is a feature-rich ORM (Object Relational Model). You can not find all the features in official documentation of Laravel Eloquent.

I believe, to understand any open source software or framework, you have to spend more time reading the source code.

If you read through the classes which power Laravel Eloquent, you will find many interesting features which can be useful while you developing Laravel based application.

Here are some features that you may not know.

1. Expressive Where Syntax

We can make our where clause more expressive when retrieving a particular record. Ususally when you grab a record, you would do like this:

$product = Product::where('category', 2)->get();

You can make this query more expressive like below, by suffixing the attribute to where clause itself.

$product = Product::whereCategory(2)->get();

2. Returning Relations On Model Save

If we save a model and return the saved model, it only returns the model you are saving. What if, you want to return its related model. You can do like below:

public function store(Request $request, $categoryId)
{
    $product = new Product();
    $product->fill($request->all());
    $product->category_id = $categoryId;

    $product->category; // Set the model to load related model
    // On return it will provide related model
    return $product->save();

3. Specifying Attributes in find() Method

Usually, you find by the model by a primary key like below.

$product = Product::find(1);
// Or
$product = Product::findOrFail(1);

You can specify the attributes to select as a second argument like below.

$product = Product::find(1, ['name', 'sku', 'price']);
// Or
$product = Product::findOrFail(1, ['name', 'sku', 'price']);

4. Increment And Decrement Model Attributes

You can increment or decrement a model attribute using increment() and decrement() methods. Just like below:

// adds one view to product model
Product::find($productId)->increment('views');
// or you can add any number
Product::find($productId)->increment('views', 5);
// Remove one view from producr model
Product::find($productId)->decrement('views');
// or you can add any number
Product::find($productId)->decrement('views', 5);

5. Checking If Models Are Same

You can determine if two models have the same ID and belongs to same database table using is() method.

$product = Product::find(1);
$sameProduct = Product::find(1);
$nextProduct = Product::find(2);
$product->is($sameProduct);       // true
$product->is($nextProduct);       // false

Very handy when you are dealing with a lot of models.

6. Clone A Model

You can replicate or clone a model using replicate() method. It will create a copy of the model into a new, non-existing element.

$product = Product::find(1);
$newProduct = $product->replicate();

$newProduct->save();

7. Checking If Model Has Changed

You can determine if the model or given attributes have been changed using isDirty() method.

$product = Product::first();
$product->isDirty();    // false

$product->name = "Lenove ThinkPad";
$product->isDirty();    // true

You can also pass attributes to check, if they have changed or not.

$product->isDirty('name');      // true
$product->isDirty('price');     // false

8. Get Changed Attributes

If you want to see the changed attributes for a model, you can use getChanges() method. For our above code example, we will get the changed attributes.

$product->getChanges();

Result will be:

[
    'name'  =>  'Lenovo ThinkPad'
]

9. Get Original Attributes

When you are mutating an Eloquent model, you can get the original attributes by using getOriginal() method.

$product = Product::first();
$product->name;     //  Lenovo ThinkPad 2019

$product->name = "Lenovo ThinkPad";     //  Lenovo ThinkPad

$product->getOriginal('name');      //  Lenovo ThinkPad 2019

// Or

$product->getOriginal();

10. Saving Models and Relationships

You can save model and its corresponding relationship using the push() method.

$product = Product::first();
$product->name = "Lenovo ThinkPad";

$product->category->name = "Laptops";
$product->push(); // This will update the product and category models both.

11. Reloading Fresh Model

If you want to reload a fresh instance of the model from the database, you can use fresh() method on the model.

$product = Product::first();
$product->name;     // Lenovo ThinkPad 2018

// Meanwhile, another user updated the record for this model and name changed to "Lenovo ThinkPad 2019"

$freshProduct = $product->fresh();
$freshProduct->name;    // Lenovo ThinkPad 2019

// Your $product instance has old value
$product->name;     // Lenovo ThinkPad 2018

12. Reloading Existing Model

You can also reload the fresh model with fresh values from database, using refresh() method.

$product = Product::first();
$product->name;     // Lenovo ThinkPad 2018

// Meanwhile, another user updated the record for this model and name changed to "Lenovo ThinkPad 2019"

$product->refresh();
$product->name;    // Lenove ThinkPad 2019

That’s all for now. If you like this post or have a suggestion to improve this post, please leave a comment in below comment box.

Your little help will keep this site alive and help us to produce quality content for you.