Let’s go through some tips and tricks which we can add to Laravel applications to optimize website performance.
-
Invokable Controllers:
If you want to create a controller with just one action in Laravel, you can use the __invoke() method and even create an “invokable” controller.
Example:
Class ControllerName extends controller {
Public function _invoke($id){
return view(‘user.profie’, [‘user’ => User::findOrFail($id)]);
}}
Routes: Route::get('user/{id}' ‘ControllerName’);Command to generate command:
php artisan make:controller ControllerName --invokable -
Unsigned Integer:
For foreign key migrations instead of integer() we should use unsignedInteger() type or integer()->unsigned() , otherwise you may get SQL errors.
Example: Schema::create('employees', function (Blueprint $table) {
$table-> unsignedInteger ('company_id'); //if primary id Increments
$table->foreign('company_id')->references('id')->on('companies');
}); - OrderBy with Eloquent: You can specify orderBy() directly on your Eloquent relationships.
Example: return $this->hasMany(Product::class)->orderBy('name');
- Raw DB Queries: You can use RAW DB queries in various places, including havingRaw() function after groupBy().
Example: Product::groupBy('category_id')->havingRaw('COUNT(*) > 1')->get();
- Eloquent where date methods: In Eloquent, check the date with functions whereDay() , whereMonth() , whereYear() , whereDate() and whereTime() .
Example:
$products = Product::whereDate('created_at', '2018-01-31')->get();
$products = Product::whereMonth('created_at', '12')->get();
$products = Product::whereDay('created_at', '31')->get();
$products = Product::whereYear('created_at', date('Y'))->get();
$products = Product::whereTime('created_at', '=', '14:13:58')->get(); - Route group within a group: In Routes, you can create a group within a group, assigning a certain middleware only to some URLs in the “parent” group.
Example:
Route::group(['prefix' => 'account', 'as' => 'account.'], function() {
Route::get('login', 'AccountController@login');
Route::get('register', 'AccountController@register');
Route::group(['middleware' => 'auth'], function() {
Route::get('edit', 'AccountController@edit');
});
}); - Increments and decrements: if we want to increment some DB column in some table in Laravel, just use increment() function. We can increment value with any number.
Example:
Post::find($post_id)->increment('view_count');
User::find($user_id)->increment('points', 50); - We can check if the View file exists before actually loading it.
Example:
if (view()->exists('custom.page')) {
// Load the view
} - No timestamp columns in the table: If our DB table doesn’t contain timestamp fields created_at and updated_at, we can specify that the Eloquent model wouldn’t use them, with $timestamps = false property.
Example:
class Company extends Model
{
public $timestamps = false;
} - Database migrations column types:
$table->geometry('positions');
$table->ipAddress('visitor');
$table->macAddress('device');
$table->point('position');
$table->uuid('id');See all column types: visit here
- Soft-deletes: multiple restores: When using soft-deletes, we can restore multiple rows in one sentence.
Post::withTrashed()->where('author_id', 1)->restore();
- Don’t create Controllers when we want the route to just show a certain view:
Just use Route::view() function
Route::view('about', 'texts.about');
- Image validation: While validating uploaded images, we can specify the dimensions that are required.
Example:
'photo' => 'dimensions:max_width=4096,max_height=4096' - Blade @auth: Instead of if-statement to check logged in user, use @auth directive.
Example:
@auth
// The user is authenticated.
@endauth - To Fail or Not to Fail function: In addition to findOrFail(), there’s also the Eloquent method firstOrFail() which will return a 404 page if no records for the query are found.
Example:
$user=User::where('email','codechief@gmail.com')->firstOrFail(); - More convenient DD: Instead of doing dd($result); you can put ->dd() as a method directly at the end of your Eloquent sentence, or any Collection.
Example:
// Instead of
$users = User::where('name', 'Taylor')->get();
dd($users);
// Do this
$users = User::where('name', 'Taylor')->get()->dd(); - How to avoid error in {{ $post->user->name }} if user is deleted? :
You can assign a default model in belongsTo relationship, to avoid fatal errors when calling it like {{ $post->user->name }} if $post->user doesn’t exist.public function user()
{
return $this->belongsTo('App\User')->withDefault();
} - Redirect to Specific Controller Method: We can redirect() not only to URL or specific route, but to a specific Controller’s specific method, and even pass the parameters. Use this:
Example: return redirect()->action('SomeController@method',['param' => $value]);
- Update parent updated_at easily: If we are updating a record and want to update the updated_at column of the parent relationship (like, we add new post comment and want posts.updated_at to renew), just use $touches = [‘post’]; property on child model.
Example:
class Comment extends Model
{
/**
* All of the relationships to be touched.
*
* @var array
*/
protected $touches = ['post'];
} - Use withCount() to Calculate Child Relationships Records: If you have hasMany() relationship, and you want to calculate “children” entries, don’t write a special query. For example, if you have posts and comments on your User model, write this withCount() :
public function index()
{
$users = User::withCount(['posts', 'comments'])->get();
return view('users', compact('users'));
}
If you have skills in PHP programming and you want to enhance your career in this field, a PHP certification from StudySection can help you reach your desired goals. Both beginner level and expert level PHP Certification Exams are offered by StudySection along with other programming certification exams.