Home > Article > Backend Development > When should I use `$model->relation()` vs. `$model->relation()` in Laravel Eloquent?
relation()` vs. `$model->relation()` in Laravel Eloquent? " />
In Laravel's Eloquent ORM, understanding the distinction between $model->relation(); and $model->relation is crucial.
Invoking $model->relation() directly calls the relationship function defined in the model. This function typically resembles:
<code class="php">public function distributors() { return $this->hasMany('Distributor'); }</code>
By calling $store->distributors(), you obtain the return value of $this->hasMany('Distributor'), which is an instance of IlluminateDatabaseEloquentRelationsHasMany.
When to Utilize $model->relation(): This method is valuable when you need to tailor the relationship query further before executing it. For instance:
<code class="php">$distributors = $store->distributors()->where('priority', '>', 4)->get();</code>
Using $store->distributors()->get() is a simpler alternative, but it yields the same outcome.
Laravel employs a behind-the-scenes technique that enables direct access to relationship results as properties. Invoking $model->relation does not actually access an existing property. Instead, Laravel intercepts this call and routes it to __get().
This method ultimately calls getAttribute() with the property name ('distributors'), which proceeds to check if the relationship is cached ('relations' array). If not, and if a relationship method exists, it attempts to load it (getRelationshipFromMethod). Finally, the model retrieves the results from the relationship through getResults(), which executes the query.
In essence, $model->relation is equivalent to $model->relation()->get(), returning the results of the relationship directly.
Understanding this difference is vital for effective Eloquent usage.
The above is the detailed content of When should I use `$model->relation()` vs. `$model->relation()` in Laravel Eloquent?. For more information, please follow other related articles on the PHP Chinese website!