laravel学习笔记--模型注入

路由与模型绑定

当向路由或控制器方法注入模型 ID 时,您可能总是会检索该 ID 与模型是否一致。Laravel
路由模型绑定提供了一个方便的方案,它可以自动注入模型实例到路由中。例如,您可以注入与给定 ID 匹配的整个 User
模型实例,而不是注入用户的 ID

隐式绑定

Laravel 会自动处理在路由或控制器方法中,与类型提示的变量名相匹配的路由段名称的的 Eloquent 模型

Route::get('users/{user}', function (App\Models\User $user) {
    dd($user);
});

就是说,
由于$user变量是模型中的user,也就是数据库模型,
变量{user}又与模型中的$user对应,
其实,变量{user}是id,是模型id,
laravel会根据传入的id去查询模型中有没有这个数据,
如果没有这个数据,就会返回404

如:如果传递的id在模型中是存在的
在这里插入图片描述

如果id在模型中不存在,就会报404
在这里插入图片描述
当然,默认是以id作为传递键的,如果想要自定义键名也是可以的
比如这个,是以邮箱为键名,传递的就要邮箱了,会根据邮箱去模型中查找

Route::get('users/{user:email}', function (App\Models\User $user) {
    dd($user);
});

上面说到的是在定义路由的时候就定义的,也可以去模型中定义键名

如果希望模型绑定在检索给定的模型类时,默认使用的是 id 以外的数据库字段,则可以重写 Eloquent 模型上的 getRouteKeyName 方法

/**
 * 获取该模型的路由的自定义键名
 *
 * @return string
 */
public function getRouteKeyName()
{
    return 'email';//以id为键名
}

例如,一个完整使用模型注入的例子

第一步,在控制器中传入模型,这个会根据路由传递的id值去查找书籍

public function edit(Blog $blog)
    {
        return view('blog.edit',['blog'=>$blog]);
        //传递参数到视图中,视图就可以使用这个变量了
    }

第二步,在视图中使用它
因为在控制器中传递了一个变量到视图中,所以,,是可以使用这个变量的

<input type="text" class="form-control" 
value="{{$blog->title}}" id="exampleFormControlInput1">
posted @ 2022-11-20 01:50  小信吖  阅读(94)  评论(0)    收藏  举报