Page 和评论将使用 Eloquent 提供的“一对多关系”。最终,我们将得到一个个人博客系统的雏形,并布置一个大作业,供大家实战练习。
1. 初识 Eloquent
Laravel Eloquent ORM 是 Laravel 中非常重要的部分,也是 Laravel 能如此流行的原因之一。中文文档在:
在前面的教程中已经建立好的 learnlaravel5/app/Page.PHP 就是一个 Eloquent Model 类:
若想进一步了解 Eloquent,推荐阅读系列文章:深入理解 Laravel Eloquent
2. 创建 Comment 模型
首先我们要新建一张表来存储 Comment,命令行运行:
成功以后,修改 migration 文件 learnlaravel5/database/migrations/***_create_comments_table.PHP 的相应位置为:
之后运行:
去数据库里瞧瞧,comments 表已经躺在那儿啦。
3. 建立“一对多关系”
修改 Page 模型:
class Page extends Model {
public function hasManyComments()
{
return $this->hasMany('App\Comment','page_id','id');
}
}
搞定啦~ Eloquent 中模型间关系就是这么简单。
模型间关系中文文档:
4. 前台提交功能
修改 Comment 模型:
class Comment extends Model {
protected $fillable = ['nickname','email','website','content','page_id'];
}
增加一行路由:
运行以下命令创建 CommentsController 控制器:
修改 CommentsController:
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Redirect,Input;
use App\Comment;
class CommentsController extends Controller {
public function store()
{
if (Comment::create(Input::all())) {
return Redirect::back();
} else {
return Redirect::back()->withInput()->withErrors('评论发表失败!');
}
}
}
修改视图 learnlaravel5/resources/views/pages/show.blade.PHP:
@section('content')
<h1 style="text-align: center; margin-top: 50px;">{{ $page->title }}
<div id="new">
<form action="{{ URL('comment/store') }}" method="POST">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<input type="hidden" name="page_id" value="{{ $page->id }}">
<div class="form-group">
<div class="conmments" style="margin-top: 100px;">
@foreach ($page->hasManyComments as $comment)
<div class="one" style="border-top: solid 20px #efefef; padding: 5px 20px;">
<div class="nickname" data="{{ $comment->nickname }}">
@if ($comment->website)
<a href="{{ $comment->website }}">
<h3>{{ $comment->nickname }}</h3>
</a>
@else
<h3>{{ $comment->nickname }}</h3>
@endif
<h6>{{ $comment->created_at }}</h6>
</div>
<div class="content">
<p style="padding: 20px;">
{{ $comment->content }}
</p>
</div>
<div class="reply" style="text-align: right; padding: 5px;">
<a href="#new" onclick="reply(this);">回复</a>
</div>
</div>
@endforeach
<div class="alert alert-danger">
Whoops!
There were some problems with your input.@foreach ($errors->all() as $error)- {{ $error }}
@endforeach