1. updateOrCreate.
- If you need to check if the record exists, then update it or create a new one, you can do it in an updateOrCreate () statement.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <span class="token comment">// Logic sử lý như sau</span> <span class="token variable">$flight</span> <span class="token operator">=</span> Flight <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">where</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'title'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'departure'</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">'destination'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'San Diego'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">first</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token variable">$flight</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$flight</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">update</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'price'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'99'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'discounted'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'1'</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token variable">$flight</span> <span class="token operator">=</span> Flight <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">create</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'title'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'departure'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'destination'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'San Diego'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'price'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'99'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'discounted'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'1'</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Thay vào đó ta có thể dùng updateOrCreate()</span> <span class="token variable">$flight</span> <span class="token operator">=</span> Flight <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">updateOrCreate</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'title'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'departure'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'destination'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'San Diego'</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'price'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'99'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'discounted'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'1'</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
2. Eloquent relationships
- You can specify orderBy () directly on your Eloquent relationships.
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">products</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> Product <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 keyword">public</span> <span class="token keyword">function</span> <span class="token function">productsByName</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> Product <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">orderBy</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'name'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
3. Eloquent method latest / oldest.
- Instead of using order by created_at desc / asc, you can use the Eloquent method latest / oldest.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token comment">// Thay vì viết</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">orderBy</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'created_at'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'desc'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Bạn có thể sử dụng</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">latest</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Mặc định latest() sẽ order theo created_at</span> <span class="token comment">// Tương tự với method oldest() cũng order by created_at asc</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">oldest</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Bạn có thể chỉ ra cụ thể order theo trường nào</span> <span class="token comment">// VD: Nếu bạn muốn order theo updated_at</span> <span class="token variable">$lastUpdateUser</span> <span class="token operator">=</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">latest</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'updated_at'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">first</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
4. Query Scopes
- You can combine query and query scopes in Eloquent, using multiple scopes in a single query.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token comment">// app/User.php model</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">scopeActive</span> <span class="token punctuation">(</span> <span class="token variable">$query</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$query</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">'active'</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">)</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">scopeRegisteredWithinDays</span> <span class="token punctuation">(</span> <span class="token variable">$query</span> <span class="token punctuation">,</span> <span class="token variable">$days</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$query</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">'created_at'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'>='</span> <span class="token punctuation">,</span> <span class="token function">now</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">subDays</span> <span class="token punctuation">(</span> <span class="token variable">$days</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Controller</span> <span class="token variable">$user</span> <span class="token operator">=</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">registeredWithinDays</span> <span class="token punctuation">(</span> <span class="token number">30</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">active</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
5. Auth
- If you want to get ID of the logged in user.
1 2 3 4 5 | <span class="token number">1.</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> <span class="token function">auth</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">id</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token number">2.</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> <span class="token package">Auth</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">user</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">id</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token number">3.</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> <span class="token function">auth</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">user</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">id</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token number">4.</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> <span class="token package">Auth</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">id</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
6. Foreach loop
- In Blade, inside the
@foreach
loop, with the $ loop variable, you can check if the current element is its first, last, or number in the iteration.
1 2 3 4 5 6 7 8 9 10 11 12 | @ <span class="token keyword">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$users</span> <span class="token keyword">as</span> <span class="token variable">$user</span> <span class="token punctuation">)</span> @ <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token variable">$loop</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">first</span> <span class="token punctuation">)</span> This is the first iteration <span class="token punctuation">.</span> @ <span class="token keyword">endif</span> @ <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token variable">$loop</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">last</span> <span class="token punctuation">)</span> This is the last iteration <span class="token punctuation">.</span> @ <span class="token keyword">endif</span> <span class="token operator"><</span> p <span class="token operator">></span> This is user <span class="token punctuation">{</span> <span class="token punctuation">{</span> <span class="token variable">$user</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">id</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> @ <span class="token keyword">endforeach</span> |
- To foreach the elements of the array and print out the STTs of the items.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token operator"><</span> table <span class="token operator">></span> <span class="token operator"><</span> thead <span class="token operator">></span> <span class="token operator"><</span> tr <span class="token operator">></span> <span class="token operator"><</span> td <span class="token operator">></span> <span class="token constant">STT</span> <span class="token operator"><</span> <span class="token operator">/</span> td <span class="token operator">></span> <span class="token operator"><</span> td <span class="token operator">></span> Name <span class="token operator"><</span> <span class="token operator">/</span> td <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> tr <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> thead <span class="token operator">></span> <span class="token operator"><</span> tbody <span class="token operator">></span> @ <span class="token keyword">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$items</span> <span class="token keyword">as</span> <span class="token variable">$index</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$item</span> <span class="token punctuation">)</span> <span class="token operator"><</span> tr <span class="token operator">></span> <span class="token operator"><</span> td <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> <span class="token variable">$index</span> <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> td <span class="token operator">></span> <span class="token operator"><</span> td <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> <span class="token variable">$item</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> td <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> tr <span class="token operator">></span> @ <span class="token keyword">endforeach</span> <span class="token operator"><</span> <span class="token operator">/</span> tbody <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> table <span class="token operator">></span> |
- Instead of writing
{{ $index + 1 }}
, you can use the variable $ loop as follows{{ $loop->iteration }}
- The $ loop variable also contains many other useful properties. Read more
7. Accessors & Mutators
- Accessors : Define the method to get the desired data based on the properties of the model eg:
- To display the full name, you must add the string as follows.
1 2 | <span class="token punctuation">{</span> <span class="token punctuation">{</span> <span class="token variable">$user</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">first_name</span> <span class="token punctuation">.</span> <span class="token variable">$user</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">last_name</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- You can define a method to handle this.
1 2 3 4 5 6 7 8 9 10 | <span class="token comment">/** * Get the user's full name. * * @return string */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">getFullNameAttribute</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 double-quoted-string string">" <span class="token interpolation"><span class="token punctuation">{</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">first_name</span> <span class="token punctuation">}</span></span> <span class="token interpolation"><span class="token punctuation">{</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">last_name</span> <span class="token punctuation">}</span></span> "</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
- To get the full name, just call
1 2 | <span class="token punctuation">{</span> <span class="token punctuation">{</span> <span class="token variable">$user</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">fullName</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">or</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> <span class="token variable">$user</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">full_name</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- Mutators : Will set the value of the model before saving it to the database
1 2 3 4 5 6 7 8 9 | <span class="token comment">/** * Set the post's slug. * */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">setSlugAttribute</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">attributes</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'slug'</span> <span class="token punctuation">]</span> <span class="token operator">=</span> Str <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">slug</span> <span class="token punctuation">(</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">title</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'-'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
8. Where attribute
- Normally, when using where, we would write the following:
1 2 | <span class="token variable">$use</span> <span class="token operator">=</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">where</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">'I am Gosu'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
- But can write more concisely.
1 2 | <span class="token variable">$use</span> <span class="token operator">=</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">whereName</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'I am Gosu'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
- You can where any field similar to the one above e.g. role_id -> whereRoleId, status -> whereStatus
9. Soft-deletes
- Be careful with the soft delete and query builder operations. Don’t forget that soft delete will exclude items when you use Eloquent, but won’t work if you use the query builder.
1 2 3 4 5 6 | <span class="token comment">// Chỉ lây những user có deleted_at null </span> <span class="token variable">$user</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 punctuation">;</span> <span class="token comment">// Sẽ lấy tât cả user</span> <span class="token variable">$user</span> <span class="token operator">=</span> <span class="token constant">DB</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">table</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'users'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
10. CONST
- To make your code more readable to others, instead of using hard-coded numbers for some values, set them to connst constants with explicit names.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token comment">// Thay vì sử dụng các số hard coded, mọi người sẽ không hiểu role_id 1 là admin</span> <span class="token variable">$use</span> <span class="token operator">=</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">where</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'role_id'</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Add const in AppUser.php</span> <span class="token keyword">class</span> <span class="token class-name">User</span> <span class="token keyword">extends</span> <span class="token class-name">Authenticatable</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> <span class="token constant">ROLE_ADMIN</span> <span class="token operator">=</span> <span class="token number">1</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token constant">ROLE_USER</span> <span class="token operator">=</span> <span class="token number">2</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$use</span> <span class="token operator">=</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">where</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'role_id'</span> <span class="token punctuation">,</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">ROLE_ADMIN</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |