超简单的Laravel新手入门教程

添加评论

此课程是收费课程,请先购买或加入会员后再访问。

一个活动发布完成后,没有用户来互动这也太单调了。这一集要做的就是来添加用户评论。

在开始今天的课程之前,首先来思考一个非常简单的问题。
一个购物车里面,可以放多少件商品?

答案非常简单,有很多(has many)。这也就是我们数据库关联中所说的一对多关系。
做评论功能,关注的核心问题也是has many关系。一个issue,对应多个comment

创建model和migration

php artisan make:model Models/Comment -m

修改migration文件

public function up()
{
    Schema::create('comments', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('issue_id');
        $table->string('name');
        $table->string('email');
        $table->text('content');
        $table->timestamps();
    });
}

运行migrate,生成comments表。

php artisan migrate

Tips: 为了体现归属关系,也就是一个 issue 对应多个 comment 的关系。要在comments中添加一个新的字段issue_id,这个在后面会有妙用。

form

<form class="am-form" method="post" action="{{route('comments.store')}}">
    {{csrf_field()}}
    <input type="hidden" name="issue_id" value="{{$issue->id}}">
    ...
</form>

Tips: 因为comments表中,有一个issue_id。这里就需要放一个隐藏的input,将当前issueid传递过去。

route

web.php中加上

Route::resource('comments', 'CommentsController', ['only' => 'store']);

Tips: 这里的only的意思,我想你肯定一下就猜到了。因为只需要评论的添加功能,所以只需要store这一条路由。

controller

php artisan make:controller CommentsController

还是先来检测一下,评论数据传递过来了没有

public function store(Request $request)
{
    return $request->all();
}

当前发布评论所在页面的issue_id已经传递过来了

进一步修改为

//一定记得要use model
use App\Models\Comment;

class CommentsController extends Controller
{
    public function store(Request $request)
    {
        Comment::create($request->all());
        return back();
    }
}

Tips: 这里 back()的意思,就是返回上一页。

提交后,出现错误。这是因为我们模型中忘记添加白名单了。

model

Models/Comment.php中,添加白名单

class Comment extends Model
{
    protected $fillable = ['issue_id', 'name', 'email', 'content'];
}

再次提交后,打开sequel pronavicat,观察评论是否已经存进comments表了。
成功后,再来提交另一条评论。

comment模板

现在不太好办的一个事就是如何得到这个 issue 下的所有 comment 。这时候我多么多么希望在 IssuesControllershow 方法中,我可以使用这样的语句啊

public function show($id)
{
    $issue = Issue::find($id);

    //当前issue的comments
    $comments = $issue->comments;
    return $comments;
}

现在刷新一下页面,只会得到一片空白...

其实这在laravel中完全是可以轻松实现的,方法就是https://laravel.com/docs/5.5/eloquent-relationships

建立一对多的关系

第一步,到Issue.php模型中添加

public function comments()
{
    return $this->hasMany('App\Models\Comment');
}

Tips: 一个issue有很多个comment,所以这里要用复数的comments

第二步,到Comment.php模型 中,添加

public function issue()
{
    return $this->belongsTo('App\Models\Issue');
}

Tips: 每个comment只都属于一个issue,所以这里的issue是单数。

好了,就是这简单的两步。issuecomment的关联关系就已经定义完毕了。
再来刷新一下页面,comments出现了。

最后一步,完成show方法

public function show($id)
{
    $issue = Issue::find($id);
    $comments = $issue->comments;
    return view('issues.show', compact('issue', 'comments'));
}

Tips: 如果需要发送多个数据到模板,可以使用phpcompact函数来简化代码。

显示comment

show.blade.php中找到评论部分,加上foreach

@foreach($comments as $comment)
    <li class="am-comment">
        <img src="/assets/img/avatar2.png" alt="" class="am-comment-avatar" width="48" height="48">

        <div class="am-comment-main">
            <header class="am-comment-hd">
                <div class="am-comment-meta">
                    <span class="am-comment-author">{{$comment->name}}</span>
                    {{$comment->created_at->diffForHumans()}}
                </div>
            </header>
            <div class="am-comment-bd">{{$comment->content}}</div>
        </div>
    </li>
@endforeach

不错,之前发布的评论已经正确的显示出来了。

用户头像

目前还有一点不完美的是,所有用户的头像,都显示了Pipi的头像。
这个地方我们使用 http://en.gravatar.com/ 的服务来解决问题。如果用户使用过gravatar,它是可以通过 email地址来取得用户的头像的。

Comment.php模型中

public function avatar()
{
    return "https://www.gravatar.com/avatar/" . md5(strtolower($this->email)) . "?d=retro&s=48";
}

这样到 show.blade.php 中,

<img src="{{$comment->avatar()}}" ...>

这样就可以正确显示头像了。


现在就注册ITFun.tv会员
持续关注IT界最新技术,随时更新相关课程。在线学习IT课程或直接报名参加线下武汉PHP、Web前端培训。

仅仅30秒钟就可以简单注册

会员注册(免费)
×