摘要:编辑迁移文件我们为表格添加了外键,同时生定义了约束,该约束允许删除父表文章的时候,自动删除关联的子表评论。关联中文文档的辅助函数列表中文文档
本节将学习 Eloquent Relations,表与表之间存在着多种关系,举例如下:
一对一:文章与作者
一对多:文章与评论
多对多:标签与文章
文章与评论的一对多关系一对多关系,主要理解两点:
如何实现一对多关系
实现了之后能给开发带来什么便利
一对多关系实现首先创建 comments 相关:
$ php artisan make:model Comment -mc
同样,为了遵循以前的约定,把生成的 CommentController 改成复数形式。
编辑迁移文件:
/database/migrations/2017_04_15_062905_create_comments_table.php public function up() { Schema::create("comments", function (Blueprint $table) { $table->increments("id"); $table->unsignedInteger("post_id"); $table->string("body"); $table->timestamps(); $table->foreign("post_id") ->references("id") ->on("posts") ->onDelete("cascade"); }); }
我们为 comments 表格添加了 post_id 外键,同时生定义了 onDelete cascade 约束,该约束允许删除父表(文章)的时候,自动删除关联的子表(评论)。
最后,执行迁移:
$ php artisan migrate
接下来,我们就可以定义文章与评论的一对多关系了:
/app/Post.php public function comments() { return $this->hasMany(AppComment::class); }
在 comments 方法中,我们并没有指定对应的外键,这是因为我们在定义迁移的时候,严格按照约定 (posts_id),因此 Laravel 会去自动寻找对应的外键。::class 方法也可以写成:
return $this->hasMany("AppComment");一对多关系的作用
定义好了文章与评论的一对多关系之后,我们就可以方便的进行相关操作了,先来练习下:
$ php artisan tinker
为了方便操作,我们先允许评论内容 body 字段批量赋值:
/app/Comment.php protected $fillable = ["body"];
首先是根据文章来直接创建评论:
>>> $post = AppPost::first() >>> $post->comments()->create(["body"=>"评论1"]) >>> $post->comments()->create(["body"=>"评论2"])
可以发现,我们可以根据文章的实例来直接创建对应的评论,而且不需要去确定评论post_id 字段。
创建好之后,我们可以方便的获取文章的评论:
>>> $post->comments;
我们传入的是 comments 属性而不是方法,Laravel 会返回该文章对应评论的集合,比如我们可以将其转化为其他格式:
>>> $post->comments->toJson()
当然了,也可以使用 comments() 方法返回 Eloquent 模型,再进行进一步操作:
>>> $post->comments()->get()->toArray() >>> $post->comments()->pluck("body")
同样的,如果我们要根据评论来操作相关文章,我们需要先定义评论与文章的多对一关系:
/app/Comment.php public function post() { return $this->belongsTo(AppPost::class); }
重启 tinker:
>>> $comment = AppComment::first() >>> $comment->post; >>> $comment->post->title;评论的显示与创建 显示评论
显示评论,比较简单,直接使用 `Bootstrap 的 card 模板即可:
/resources/views/posts/show.blade.php@foreach ($post->comments as $comment){{ $post->title }}
{{$post->body}}
{{$comment->created_at->diffForHumans() }}{{ $comment->body }}
@endforeach
同时,我们使用了 Carbon 的 diffForHumans 方法,用来显示「距离现在多久」。
创建评论最后是评论的创建,首先是视图,放在显示评论下方即可:
/resources/views/posts/show.blade.php添加评论
对应的路由:
Route::post("/posts/{post}/comments","CommentsController@store");
最后是控制器:
validate(request(),[ "body" => "required|min:5" ]); $post->addComment(request("body")); return back(); } }
首先,依旧是使用路由模型的自动绑定功能,然后将添加评论的方法进行封装,方便重复使用:
/app/Post.php public function addComment($body) { $this->comments()->create(compact("body")); }
最后使用辅助方法 back(),该方法生成一个重定向响应让用户返回到之前的位置。
Eloquent: 关联 | Laravel 5.4 中文文档
Cards · Bootstrap
Laravel 的辅助函数列表 | Laravel 5.4 中文文档
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/22749.html
摘要:本节将实现文章评论与用户关联的功能。关系定义首先修改与表,增加字段增加全部回滚并重新执行迁移添加用户表与文章表评论表的一对多关系添加文章评论表与用户表的多对一关系同时,评论表的字段增加。同时,我们还自定义了返回的错误信息。 本节将实现文章、评论与用户关联的功能。 关系定义 首先修改 posts 与 comments 表,增加 user_id 字段 /database/migratio...
摘要:将上述的一系列查询进行封装模型到了这一步,我们基本上实现了文章归档的功能。但是有一个问题,文章归档实际上包括在通用视图中,这就意味着,网站的所有请求都需要返回,否则就会报错。数据库之数据库请求构建器中文文档的视图功能中文文档 首先,要实现的是按照日期来统计文章,原始的 SQL 如下: select year(created_at) year, monthname(c...
摘要:为的辅助方法,用于截取字符串的前个字符,然后返回前个字符加的格式。显示某篇文章显示某篇文章的比较简单,路由注意要放在下面,假如这样那么,我们访问的时候,会被当成是的查询参数。 文章的显示功能比较简单,分为两部分: 文章列表 具体的某篇文章 显示文章列表 路由之前已经定义好: Route::get(/posts,PostsController@index); 控制器: public ...
摘要:基本功能创建文章的第一步是用户发请求,然后返回创建文章的页面。实际上,会报错添加保护虽然我们完成了基本功能,但是提交请求的时候还是会报错,其实这是防止攻击。假如违反了规则,错误信息会自动被保存在闪存的中,即只对下一次请求生效。 基本功能 创建文章的第一步是用户发请求,然后返回创建文章的页面。 路由:处理用户「创建文章」的请求 /routes/web.php Route::get(/po...
摘要:熟悉了路由与视图的基本操作之后,我们来让视图显示一个任务列表吧。创建迁移现在,我们就可以创建一个用来生成任务表的迁移了。 熟悉了路由与视图的基本操作之后,我们来让视图显示一个任务列表吧。主要知识点: 数据迁移 查询构造器 数据库 创建数据库 首先创建一个数据库: $ mysql -uroot -p mysql> create database laratasks; 数据库配置 La...
阅读 1683·2021-09-28 09:43
阅读 1083·2021-09-23 11:22
阅读 2558·2021-09-14 18:05
阅读 1796·2019-08-30 15:52
阅读 2769·2019-08-30 10:55
阅读 1960·2019-08-29 16:58
阅读 1248·2019-08-29 16:37
阅读 2989·2019-08-29 16:25