Laravel is one of the most popular PHP Frameworks today, with great support for most developer requirements. However, besides the features written in documents, Laravel has many hidden features. In this article, I will share the tips about Laravel that I have collected.
See also: Tips in Laravel you may not know. (Part 1)
1. Model all: columns
When using Model::all()
, you can select the columns you want to retrieve from the database.
1 2 |
<span class="token variable">$users</span> <span class="token operator">=</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">all</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'id'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'name'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'email'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
2. How to avoid errors in {{$ post-> user-> name}} if the user does not exist?
When defining a relationship, you can assign the default model with withDefault()
to avoid errors when calling {{ $post->user->name }}
if $post->user
does not exist.
1 2 3 4 5 6 7 |
<span class="token comment">/** * Get the author of the post. */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">user</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">belongsTo</span> <span class="token punctuation">(</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">withDefault</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
3. Conditions in a relationship
1 2 3 4 5 6 7 8 |
<span class="token keyword">class</span> <span class="token class-name">Category</span> <span class="token keyword">extends</span> <span class="token class-name">Model</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">posts</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">hasMany</span> <span class="token punctuation">(</span> Post <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">where</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'status'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'!='</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'hide'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
4. Write neat where in Query Builder
The 3 code snippets below are similar:
1 2 3 4 5 6 |
$products = Product::where('category', '=', 3)->get(); $products = Product::where('category', 3)->get(); $products = Product::whereCategory(3)->get(); |
5. Update parent timestamps relationship
When a Model is related to belongsTo
or belongsToMany
another Model, for example, Comment belongsTo
Post. If you want to update the parent Model’s timestamp when the child Model is updated, for example, when the Comment is updated, the updated_at field of Post will be updated as well. You only need to add the $touches
to the Model.
1 2 3 4 5 6 7 8 9 10 |
<span class="token keyword">class</span> <span class="token class-name">Comment</span> <span class="token keyword">extends</span> <span class="token class-name">Model</span> <span class="token punctuation">{</span> <span class="token keyword">protected</span> <span class="token variable">$touches</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'post'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">post</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">belongsTo</span> <span class="token punctuation">(</span> Post <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
When you perform an update comment like the one below, Post’s updated_at field will automatically update.
1 2 3 4 5 6 |
$comment = AppComment::find(1); $comment->text = 'Edit to this comment!'; $comment->save(); |
If you have the
$touches
but in some cases you don’t want to update the parent Model’s timestamp, you only need to add the options ['touch' => false]
and the save()
method.
1 2 3 4 5 6 |
$comment = AppComment::find(1); $comment->text = 'Edit to this comment!'; $comment->save(['touch' => false]); |