
Good content takes time and effort to come up with.
Please consider supporting us by just disabling your AD BLOCKER and reloading this page again.
Hooray! I am up with another article. In this article you will learn What is Route Model Binding in Laravel and how to change the default column from id
to another column like unique_id
Fresh installation of Laravel or working Laravel project.
Note: Here I am taking an example of Blog. But the concept remains same.
We usually use routes similar to this /posts/{id}
where we are passing id
which corresponds to posts->id
, this is usually called as injecting a model id
to route/controller method. Which later you will use to query your database like the following
/** web.php */
Route::get('/posts/{id}', 'PostsController@show');
/** PostsController.php */
public function show($id){
/** Fetch the post details by $id passed */
$post = Post::where(['id' => $id])->first();
if(!$post){
abort(404, 'Post Not Found');
}
return view('posts.show', [
'post' => $post
]);
}
What if the querying part is handled by Laravel. Wouldn't that be easier on your life. Yes, this is what we call Route Model Binding. Laravel automatically injects the model instances in your routes.
In the following example instead of post id
, we are injecting entire post model instance which matches it.
Laravel handles the id
with route model binding and given us the result . Now the code is very clean and consise.
To explain in simple words Laravel with fetch the record from database by comparing id
column
/** web.php */
/** Dont worry on the {post} naming, usually you may take {id} too :) */
Route::get('/posts/{post}', 'PostsController@show');
/** PostsController */
/** Your show() methos will look like the following */
public function show(Post $post){
/** If $post value passed is not found then laravel will call abort() automatically */
return view('posts.show', [
'post' => $post
]);
}
id
-> unique_id
By default route model binding binds to your primary key column ie id
but what if you need to change the column to other column.
Laravel has given an option to override column id
with other column in your models. For example in my Post
model I can change the id
with unique_id
in the following way
/** Other Code */
class Post extends Model{
/** Other Code */
public function getRouteKeyName(){
return 'unique_id';
}
/** Other Code */
}
You can override within the function getRouteKeyName()
. Here I wanted unique_id
to be queried all the time for route model binding for Post
model.
Hope this article was helpful. If you have liked the article then don't forget to share my website with your friends.
Move Uploaded Files From Local Computer Or Server To Amazon S3 Bucket In PHP
Client-Side Form Validation With Javascript
Add Analytics To AMP (Accelerated Mobile Pages) HTML Pages
Push Files To CPanel / Remote Server using FTP Software FileZilla
Multiple File Uploads In Laravel PHP
Laravel Last Executed Query In Plain SQL Statement For Debugging
Install NGINX In Linux / Ubuntu And Managing
Plain PHP Resumable Large File Uploads In Chunks Using FlowJs
Facebook Login With PHP Laravel Socialite
Run Raw Queries Securely In Laravel
PHP extension ext-intl * is missing
Search Engine Optimization Concepts
Make Laravel Controllers Slim By Skimming Form Validation Request