Source: https://laraveldaily.com
Tip 51 Don’t filter NULL values in Collections.
In Eloquent, we can filter the value according to the Null value. However, in the collection, it will no longer be possible to filter by null values, but instead will be an empty character.
1 2 3 4 5 6 7 8 | <span class="token comment">// Code sẽ hoạt động</span> <span class="token variable">$messages</span> <span class="token operator">=</span> Message <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">'read_at is null'</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">// Cái này sẽ không hoạt động, trả về 0 </span> <span class="token variable">$messages</span> <span class="token operator">=</span> Message <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 variable">$unread_messages</span> <span class="token operator">=</span> <span class="token variable">$messages</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">'read_at is null'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">count</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Sẽ hoạt động</span> <span class="token variable">$unread_messages</span> <span class="token operator">=</span> <span class="token variable">$messages</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">'read_at'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">''</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">count</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Tip 52 Email header default value of Laravel notifications
If you send Laravel notification and don’t set a value for the title in the toMail () function, then the default value of your message is the name of the class, capitalized (CamelCased) and separated by spaces. For example if we have a class
1 2 | <span class="token keyword">class</span> <span class="token class-name">UserRegistrationEmail</span> <span class="token keyword">extends</span> <span class="token class-name">Notification</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> |
then when you receive the email notification, the default subject of the email is User Registration Email
Tip 53 Composer: check for a new version.
If you want to know, in the packages in package.json which packages have new releases, you can run composer outdated . You will get information about all packages that have new versions that have been released.
1 2 3 4 5 6 7 | phpdocumentor/type-resolver <span class="token number">0.4</span> .0 <span class="token number">0.7</span> .1 phpunit/php-code-coverage <span class="token number">6.1</span> .4 <span class="token number">7.0</span> .3 Library that provides collection, processing, and rende <span class="token punctuation">..</span> . phpunit/phpunit <span class="token number">7.5</span> .9 <span class="token number">8.1</span> .3 The PHP Unit Testing framework. ralouphie/getallheaders <span class="token number">2.0</span> .5 <span class="token number">3.0</span> .3 A polyfill <span class="token keyword">for</span> getallheaders. sebastian/global-state <span class="token number">2.0</span> .0 <span class="token number">3.0</span> .0 Snapshotting of global state |
Tip 54 Fallback Route- When the path does not match any of the defined routes.
In the case of entering any path that does not match any of the previously defined routes. Usually page 40 will drop out. However, you can also redefine this using the fallback route. The fallback route allows to define the handling logic in the url path that doesn’t match any of the routes instead of bouncing a 404 page.
1 2 3 4 | Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">fallback</span> <span class="token punctuation">(</span> <span class="token keyword">function</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 single-quoted-string string">'Hm, why did you land here somehow?'</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Tip 55 Create your own blade directive .
This is quite easy to do. You just add methods (methods, functions) in the file app / Providers / AppServiceProvider.php . For example, if you replace the card
with a new line, do the following:
1 2 | <span class="token operator"><</span> textarea <span class="token operator">></span> @ <span class="token function">br2nl</span> <span class="token punctuation">(</span> <span class="token variable">$post</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">post_text</span> <span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token operator">/</span> textarea <span class="token operator">></span> |
and add directive in the boot method in AppServiceProvider
1 2 3 4 5 6 7 8 | public function boot() { Blade::directive('br2nl', function ($string) { return " <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token function">preg_replace</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'/<br(s*)?/?>/i'</span> <span class="token punctuation">,</span> <span class="token double-quoted-string string">"n", <span class="token interpolation"><span class="token variable">$string</span></span> ); ?>"</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> |
Tip 56 Use withCount () to count the number of child records.
In hasMany () relation, if you want to calculate how many child records there are, without the information of the child records. then use withCount () . For example, you want to count the number of posts (posts) and the number of comments (comments) of each user.
1 2 3 4 5 6 | <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">index</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$users</span> <span class="token operator">=</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">withCount</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'posts'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'comments'</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 keyword">return</span> <span class="token function">view</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'users'</span> <span class="token punctuation">,</span> <span class="token function">compact</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'users'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
So above .blade you can use [relatioship] _count
1 2 3 4 5 6 7 8 | @foreach ($users as $user) <tr> <td>{{ $user->name }}</td> <td class="text-center">{{ $user->posts_count }}</td> <td class="text-center">{{ $user->comments_count }}</td> </tr> @endforeach |
Tip 57 Using groupBy in Collections with option callback function
If you want to group the results under some condition that isn’t directly in the database, then you can use the closure function. For example, you want to group the users by registration date.
1 2 3 4 | <span class="token variable">$users</span> <span class="token operator">=</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">all</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">groupBy</span> <span class="token punctuation">(</span> <span class="token keyword">function</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 keyword">return</span> <span class="token variable">$item</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">created_at</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">format</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'Y-m-d'</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> |
Note, this groupBy is available on collections, and it is retrieved after retrieving results from the database.
Tip 58. Blade directive: IncludeIf, IncludeWhen, IncludeFirst
If you are not sure if a blade partial exists, then you can use them with the conditions Will load header if the .blade file exists.
1 2 | @ <span class="token function">includeIf</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'partials.header'</span> <span class="token punctuation">)</span> |
Load the header file for the user whose role_id is 1
1 2 | @ <span class="token function">includeWhen</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">role_id</span> <span class="token operator">==</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'partials.header'</span> <span class="token punctuation">)</span> |
Try to load adminlte.header, if not, load default.header
1 2 | @ <span class="token function">includeFirst</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'adminlte.header'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'default.header'</span> <span class="token punctuation">)</span> |
Tip 59 Change the Timestamp field
If we want to change the created_at and updated_at fields to something we can change in our model
1 2 3 4 5 | <span class="token keyword">class</span> <span class="token class-name">Role</span> <span class="token keyword">extends</span> <span class="token class-name">Model</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> <span class="token constant">CREATED_AT</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'create_time'</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token constant">UPDATED_AT</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'update_time'</span> <span class="token punctuation">;</span> |
Tip 60 Fast sort by created_at
Instead of using User :: orderBy (‘created_at’, ‘desc’) -> get (); You can use User :: latest () -> get () ;. By default, latest () will sort by created_at . Conversely, we also have the oldest () to order by the descending created_at field.
1 2 | 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> |
If you use a certain field to sort, like updated_at, you can do it like this
1 2 | <span class="token variable">$lastUpdatedUser</span> <span class="token operator">=</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">newest</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> |
Tip 61 Generate Images with Seed / Factories
When using faker (factories / seed) to add sample data, Faker supports our avatar style so that we can generate pictures with the attached size. For example, let’s take a 50×50 image
1 2 3 4 5 6 7 8 9 10 11 | <span class="token variable">$factory</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">define</span> <span class="token punctuation">(</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token keyword">class</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> Faker <span class="token variable">$faker</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">'name'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$faker</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">name</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'email'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$faker</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">unique</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">safeEmail</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'email_verified_at'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token function">now</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'password'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token function">bcrypt</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'password'</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'remember_token'</span> <span class="token operator">=</span> <span class="token operator">></span> Str <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token number">10</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'avatar'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$faker</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">image</span> <span class="token punctuation">(</span> <span class="token function">storage_path</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'images'</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token number">50</span> <span class="token punctuation">,</span> <span class="token number">50</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> |
Tip 62 Eloquent: Update Parent in one line.
In belongsTo () relationship, we may use Eloquent to be able to update data in a single line. For example, if we have Project -> belongsTo (User :: class), we will update the user’s email with the following command
1 2 | <span class="token variable">$project</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">user</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">'email'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">' <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> '</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Tip 63 Eloquent: Laravel 7+ Foreign Keys
Since Laravel 7, in migrations, you do not need to write two lines to define a foreign key. Laravel already supports the foreignId () method to define a foreign key.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token comment">// Trươc bản Laravel 7</span> Schema <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">'posts'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> Blueprint <span class="token variable">$table</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$table</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">unsignedBigInteger</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'user_id'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token variable">$table</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">foreign</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'user_id'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">references</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'id'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">on</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'users'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Từ bản Laravel 7 trở đi</span> Schema <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">'posts'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> Blueprint <span class="token variable">$table</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$table</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">foreignId</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'user_id'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">constrained</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">// Từ bản Laravel 7, định nghĩa cụ thể tên cột, tên bảng</span> Schema <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">'posts'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> Blueprint <span class="token variable">$table</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$table</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">foreignId</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'created_by_id'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">references</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'id'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">on</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'users'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Tip 64 Using methods with Collection.
For queries that take all the data with all () or get () , instead of repeatedly querying, we should use methods with collection as the initial query result to increase performance / efficiency. For example.
1 2 3 4 5 | <span class="token variable">$users</span> <span class="token operator">=</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">all</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token single-quoted-string string">'Max ID: '</span> <span class="token punctuation">.</span> <span class="token variable">$users</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">max</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'id'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token single-quoted-string string">'Average age: '</span> <span class="token punctuation">.</span> <span class="token variable">$users</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">avg</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'age'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token single-quoted-string string">'Total budget: '</span> <span class="token punctuation">.</span> <span class="token variable">$users</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">sum</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'budget'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Tip 65 Add events when registering a user (user)
If you want to add some action, after a new user registers, first go to app / Providers / EventServiceProvider.php and add the class (class) listener, then implement the method’s handle () function with the $ event-> user icon
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">class</span> <span class="token class-name">EventServiceProvider</span> <span class="token keyword">extends</span> <span class="token class-name">ServiceProvider</span> <span class="token punctuation">{</span> <span class="token keyword">protected</span> <span class="token variable">$listen</span> <span class="token operator">=</span> <span class="token punctuation">[</span> Registered <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">[</span> SendEmailVerificationNotification <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token keyword">class</span> <span class="token punctuation">,</span> <span class="token comment">// You can add any Listener class here</span> <span class="token comment">// With handle() method inside of that class</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> |