1. Use local scopes when you need to query things
Laravel có một cách hay để viết truy vấn cơ sở dữ liệu bằng Query Builder.
1 2 | <span class="token variable">$orders</span> <span class="token operator">=</span> Order<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">'status'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'delivered'</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">'paid'</span><span class="token punctuation">,</span> <span class="token boolean">true</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> |
Điều này khá hay. Điều này giúp tôi tập trung vào logic, điều này dễ tiếp cận hơn đối với tôi. Nhưng đoạn mã này có thể được viết tốt hơn nếu chúng ta sử dụng local scopes.
Local scopes cho phép chúng ta tạo các Query Builder methods, chúng ta có thể xâu chuỗi khi cố gắng truy xuất dữ liệu. Ví dụ: thay vì -> where (), chúng ta có thể sử dụng -> deliver () và -> pay () theo cách hay hơn như sau.
First, in our Order model, we should add some methods:
Đầu tiên, trong Order model, chúng ta nên thêm một số methods:
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">class</span> <span class="token class-name">Order</span> <span class="token keyword">extends</span> <span class="token class-name">Model</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">public</span> <span class="token keyword">function</span> <span class="token function">scopeDelivered</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">'status'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'delivered'</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">scopePaid</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">'paid'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Khi khai báo local scopes, bạn nên sử dụng cách đặt tên chính xác cho scope[Something]. Bằng cách này, Laravel sẽ biết rằng đây là một scope và sẽ sử dụng nó trong Query Builder của bạn. Hãy chắc chắn rằng bạn bao gồm đối số đầu tiên được chèn tự động bởi Laravel và là query builder instance.
1 2 3 | <span class="token variable">$orders</span> <span class="token operator">=</span> Order<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">delivered</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">paid</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> |
Để truy xuất động hơn, bạn có thể sử dụng dynamic local scopes. Mỗi scope cho phép bạn truyền các tham số.
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">class</span> <span class="token class-name">Order</span> <span class="token keyword">extends</span> <span class="token class-name">Model</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">public</span> <span class="token keyword">function</span> <span class="token function">scopeStatus</span><span class="token punctuation">(</span><span class="token variable">$query</span><span class="token punctuation">,</span> string <span class="token variable">$status</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">'status'</span><span class="token punctuation">,</span> <span class="token variable">$status</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$orders</span> <span class="token operator">=</span> Order<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'delivered'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">paid</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> |
Ở phần sau của bài viết này, bạn sẽ tìm hiểu lý do tại sao bạn nên sử dụng snake_case cho các trường cơ sở dữ liệu, nhưng đây là lý do đầu tiên: Laravel sử dụng theo mặc định where[Something] để thay thế scope trước đó. Thay vì trước đó, bạn có thể làm:
1 2 3 | Order<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">whereStatus</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'delivered'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">paid</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> |
Laravel sẽ tìm kiếm phiên bản snake_case của Something từ where[Something]. Nếu bạn có trạng thái trong DB của mình, bạn sẽ sử dụng ví dụ trước. Nếu bạn có shipping_status, bạn có thể sử dụng:
1 2 3 | Order<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">whereShippingStatus</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'delivered'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">paid</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> |
2. Use Requests files when needed
Laravel cung cấp cho bạn một cách hùng hồn để validate các biểu mẫu của bạn. Dù đó là yêu cầu POST hay yêu cầu GET, nó sẽ không validate nó nếu bạn cần.
Bạn có thể validate theo cách này trong controller của bạn:
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">store</span><span class="token punctuation">(</span>Request <span class="token variable">$request</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$validatedData</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">validate</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">'required|unique:posts|max:255'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'body'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'required'</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">// The blog post is valid...</span> <span class="token punctuation">}</span> |
Nhưng khi bạn có quá nhiều code trong các controller methods của mình, điều đó có thể khá khó chịu. Bạn muốn giảm càng nhiều code càng tốt trong controller của mình. Ít nhất, đây là điều đầu tiên tôi nghĩ nếu tôi phải viết nhiều logic. .
Laravel cung cấp cho bạn một cách dễ dàng để validate requests bằng cách tạo request classes và sử dụng chúng thay vì old-fashioned Request class. Bạn chỉ cần tạo yêu cầu của mình:
1 2 3 | php artisan make<span class="token punctuation">:</span>request StoreBlogPost |
Trong folder app/Http/Requests/ folder bạn sẽ tìm thấy file request của bạn:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token keyword">class</span> <span class="token class-name">StoreBlogPostRequest</span> <span class="token keyword">extends</span> <span class="token class-name">FormRequest</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">authorize</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">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 function">can</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'create.posts'</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">rules</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 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">'required|unique:posts|max:255'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'body'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'required'</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> |
Bây giờ, thay vì IlluminateHttpRequest trong method của bạn, bạn nên thay thế bằng lớp vừa tạo:
1 2 3 4 5 6 7 8 | <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Http<span class="token punctuation"></span>Requests<span class="token punctuation"></span>StoreBlogPostRequest</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">store</span><span class="token punctuation">(</span>StoreBlogPostRequest <span class="token variable">$request</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// The blog post is valid...</span> <span class="token punctuation">}</span> |
Phương thức authorize () phải là boolean. Nếu sai, nó sẽ trả về 403, vì vậy hãy đảm bảo bạn bắt được nó trong phương thức render() của app/Exceptions/Handler.php:
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">render</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token punctuation">,</span> Exception <span class="token variable">$exception</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">$exception</span> <span class="token keyword">instanceof</span> <span class="token class-name"><span class="token punctuation"></span>Illuminate<span class="token punctuation"></span>Auth<span class="token punctuation"></span>Access<span class="token punctuation"></span>AuthorizationException</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token keyword">parent</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token punctuation">,</span> <span class="token variable">$exception</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Phương thức bị thiếu ở đây, trong request class, là hàm message(), là một array chứa các thông báo sẽ được trả về trong trường hợp validation thất bại:
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 | <span class="token keyword">class</span> <span class="token class-name">StoreBlogPostRequest</span> <span class="token keyword">extends</span> <span class="token class-name">FormRequest</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">authorize</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">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 function">can</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'create.posts'</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">rules</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 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">'required|unique:posts|max:255'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'body'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'required'</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">public</span> <span class="token keyword">function</span> <span class="token function">messages</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 punctuation">[</span> <span class="token single-quoted-string string">'title.required'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'The title is required.'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'title.unique'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'The post title already exists.'</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 punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Để bắt chúng trong controller của bạn, bạn có thể sử dụng biến errors trong các file blade của mình:
1 2 3 4 5 6 7 | @<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$errors</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">any</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> @<span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$errors</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">all</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">as</span> <span class="token variable">$error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">{</span> <span class="token variable">$error</span> <span class="token punctuation">}</span><span class="token punctuation">}</span> @<span class="token keyword">endforeach</span> @<span class="token keyword">endif</span> |
Trong trường hợp bạn muốn nhận validation message của một trường cụ thể, bạn có thể làm như vậy sau đó (nó sẽ trả về một thực thể false-boolean nếu validation passed được thông qua cho trường đó):
1 2 3 4 5 6 | <span class="token operator"><</span>input type<span class="token operator">=</span><span class="token double-quoted-string string">"text"</span> name<span class="token operator">=</span><span class="token double-quoted-string string">"title"</span> <span class="token operator">/</span><span class="token operator">></span> @<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$errors</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">has</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'title'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator"><</span>label <span class="token keyword">class</span><span class="token operator">=</span><span class="token double-quoted-string string">"error"</span><span class="token operator">></span><span class="token punctuation">{</span><span class="token punctuation">{</span> <span class="token variable">$errors</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 single-quoted-string string">'title'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token operator"><</span><span class="token operator">/</span>label<span class="token operator">></span> @<span class="token keyword">endif</span> |
3. Magic scopes
Khi building mọi thứ, bạn có thể sử dụng magic scopes đã được embedded
Lấy kết quả theo created_at , giảm dần (descending):
1 2 3 | 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> |
Lấy kết quả theo field , giảm dần (descending):
1 2 3 | 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">'last_login_at'</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> |
Lấy kết quả theo random của field order , giảm dần (descending):
1 2 3 | User<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">inRandomOrder</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> |
Chỉ chạy query method nếu có gì đó đúng:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token comment">// Let's suppose the user is on news page, and wants to sort it by newest first</span> <span class="token comment">// mydomain.com/news?sort=new</span> User<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">when</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">query</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'sort'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$query</span><span class="token punctuation">,</span> <span class="token variable">$sort</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">$sort</span> <span class="token operator">==</span> <span class="token single-quoted-string string">'new'</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">latest</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">return</span> <span class="token variable">$query</span><span class="token punctuation">;</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> |
Thay vì when() bạn có thể sử dụng unless, nó ngược lại với when().
4. Use Relationships to avoid big queries (or bad-written ones)
Bạn đã bao giờ sử dụng một tấn liên kết trong một truy vấn chỉ để có thêm thông tin chưa? Rất khó để viết các lệnh SQL đó, ngay cả với Query Builder, nhưng các models đã làm điều đó với Relationships. Ban đầu bạn sẽ không quen thuộc , do lượng thông tin cao mà tài liệu cung cấp, nhưng điều này sẽ giúp bạn hiểu rõ hơn về cách mọi thứ hoạt động và làm thế nào để ứng dụng của bạn chạy mượt mà hơn.
Xem Relationships’ documentation tại đây.
5. Do not store model-related static data in configs
Điều tôi thích làm là lưu trữ static data liên quan đến model bên trong model. Tôi sẽ cho bạn xem.
Thay vì viết file: BettingOdds.php
1 2 3 4 5 | <span class="token keyword">class</span> <span class="token class-name">BettingOdds</span> <span class="token keyword">extends</span> <span class="token class-name">Model</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> |
Trong file: config/bettingOdds.php
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">return</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'sports'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'soccer'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'sport:1'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'tennis'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'sport:2'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'basketball'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'sport:3'</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 punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> |
và truy cập chúng bằng cách sử dụng:
1 2 3 | <span class="token function">config</span><span class="token punctuation">(</span>’bettingOdds<span class="token punctuation">.</span>sports<span class="token punctuation">.</span>soccer’<span class="token punctuation">)</span><span class="token punctuation">;</span> |
Tôi sẽ làm như thế này:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">class</span> <span class="token class-name">BettingOdds</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 keyword">static</span> <span class="token variable">$sports</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'soccer'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'sport:1'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'tennis'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'sport:2'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'basketball'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'sport:3'</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 punctuation">;</span> <span class="token punctuation">}</span> |
và truy cập chúng bằng cách sử dụng:
1 2 3 | BettingOdds<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token variable">$sports</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'soccer'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> |
Tại sao? Bởi vì nó dễ sử dụng hơn trong các hoạt động tiếp theo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token keyword">class</span> <span class="token class-name">BettingOdds</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 keyword">static</span> <span class="token variable">$sports</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'soccer'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'sport:1'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'tennis'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'sport:2'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'basketball'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'sport:3'</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 punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">scopeSport</span><span class="token punctuation">(</span><span class="token variable">$query</span><span class="token punctuation">,</span> string <span class="token variable">$sport</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 operator">!</span> <span class="token function">isset</span><span class="token punctuation">(</span>self<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token variable">$sports</span><span class="token punctuation">[</span><span class="token variable">$sport</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">return</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">'sport_id'</span><span class="token punctuation">,</span> self<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token variable">$sports</span><span class="token punctuation">[</span><span class="token variable">$sport</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> |
Bây giờ chúng ta có thể sử dụng scopes:
1 2 3 | BettingOdds<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">sport</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'soccer'</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> |
6. Use collections instead of raw-array processing
Trước đây, chúng ta đã quen làm việc với các array theo cách thô:
1 2 3 4 5 6 7 | <span class="token variable">$fruits</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token single-quoted-string string">'apple'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'pear'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'banana'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'strawberry'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$fruits</span> <span class="token keyword">as</span> <span class="token variable">$fruit</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token single-quoted-string string">'I have '</span><span class="token punctuation">.</span> <span class="token variable">$fruit</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Bây giờ, chúng ta có thể sử dụng các advanced methods sẽ giúp chúng ta xử lý dữ liệu trong các arrays. Chúng ta có thể filter, transform, iterate and modify dữ liệu trong một array:
1 2 3 4 5 6 7 | <span class="token variable">$fruits</span> <span class="token operator">=</span> <span class="token function">collect</span><span class="token punctuation">(</span><span class="token variable">$fruits</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$fruits</span> <span class="token operator">=</span> <span class="token variable">$fruits</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">reject</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$fruit</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$fruit</span> <span class="token operator">===</span> <span class="token single-quoted-string string">'apple'</span><span class="token punctuation">;</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">toArray</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">'pear'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'banana'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'strawberry'</span><span class="token punctuation">]</span> |
Để biết thêm chi tiết, kiểm tra tài liệu mở rộng về Collections.
Khi làm việc với Query Builders, phương thức ->get() trả về một Collection instance. Nhưng hãy cẩn thận để không nhầm lẫn Collection với Query builder:
- Trong Query Builder, chúng tôi không truy xuất bất kỳ dữ liệu nào. Chúng tôi có rất nhiều phương thức liên quan đến truy vấn: orderBy(), where(), v.v.
- Sau khi chúng tôi nhấn ->get (), dữ liệu được truy xuất, bộ nhớ đã được sử dụng, nó trả về một thể hiện Collection instance. Một số Query Builder methods không khả dụng hoặc chúng có tên, nhưng tên của chúng là khác nhau. .
Nếu bạn có thể filter data ở cấp Query Builder, hãy làm điều đó! Đừng dựa vào việc filtering khi nói đến Collection instance – bạn sẽ sử dụng quá nhiều bộ nhớ ở một số nơi và bạn không muốn. Bắt đầu kết quả của bạn và sử dụng chỉ mục ở cấp độ DB.
Bài viết được dịch từ: https://medium.com/@alexrenoki/pushing-laravel-further-best-tips-good-practices-for-laravel-5-7-ac97305b8cac