1. updateOrCreate.
- Nếu bạn cần kiểm tra xem bản ghi có tồn tại hay không, sau đó cập nhật nó hoặc tạo bản ghi mới, bạn có thể thực hiện nó trong một câu lệnh updateOrCreate ()
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
- Bạn có thể chỉ định orderBy () trực tiếp trên các mối quan hệ Eloquent của mình.
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.
- Thay vì sử dụng order by created_at desc/asc thì có thể sử dụng 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
- Bạn có thể kết hợp và query scopes truy vấn trong Eloquent, sử dụng nhiều scope trong một truy vấn.
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
- Nếu bạn muốn nhận được ID của người dùng đã đăng nhập.
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
- Trong Blade, bên trong vòng lặp
@foreach
, với biến $loop, bạn có thể kiểm tra xem phần tử hiện tại là đầu tiên, cuối cùng hay số của nó trong 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> |
- Để foreach các phần tử trong mảng và in ra STT của các item.
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> |
- Thay vì viết
{{ $index + 1 }}
thì có thể dùng biến $loop như sau{{ $loop->iteration }}
- Biến $loop cũng chứa nhiều thuộc tính hữu ích khác. Đọc thêm
7. Accessors & Mutators
- Accessors: Định nghĩa method để get dữ liệu mong muốn dựa trên các thuộc tính của model VD:
- Để hiển thị full name thì bạn phải cộng chuỗi như sau.
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> |
- Bạn có thể định nghĩa method để sử lý việc này.
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> |
- Để lấy ra full name thì chỉ cần gọi
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: Sẽ set giá trị của model trước khi lưu vào 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
- Bình thường chúng ta khi sử dụng where sẽ viết như sau:
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> |
- Nhưng có thể viết ngắn gọn hơn.
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> |
- Bạn có thể where bất trường trường nào tương tự như trên VD: role_id -> whereRoleId, status -> whereStatus
9. Soft-deletes
- Hãy cẩn thận với các thao tác soft delete và query builder. Đừng quên rằng soft delete sẽ loại trừ các mục khi bạn sử dụng Eloquent, nhưng sẽ không hoạt động nếu bạn sử dụng 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
- Để làm cho code của bạn dễ đọc hơn đối với người khác, thay vì sử dụng các số được hard code cho một số giá trị, hãy đặt chúng thành các hằng số connst với tên rõ ràng.
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> |