获取微博
取出一个用户的所有微博可以通过以下方式:
$statuses = $user->statuses();
排序
根据微博的创建时间 created_at 对微博进行排序,让新创建的微博靠前显示。我们使用 Eloquent 模型提供的 orderBy 方法,通过指定字段名和排序方式来对微博进行排序。
$statuses = $user->statuses()->orderBy('created_at', 'desc');
分页
对取出的微博数据进行分页,在每个页面最多只显示 30 条微博:
$statuses = $user->statuses()->orderBy('created_at', 'desc')->paginate(30);
修改用户控制器
app/Http/Controllers/UsersController.php
statuses()
->orderBy('created_at', 'desc')
->paginate(30);
return view('users.show', compact('user', 'statuses'));
}
.
.
.
}
compact 方法可以同时接收多个参数,在上面代码我们将用户数据 $user 和微博动态数据 $statuses 同时传递给用户个人页面的视图上。
渲染微博
接下来我们来构建单条微博的局部视图,该局部视图最终将应用在用户的个人页面上。
微博的局部视图包含一条微博动态的发布者,发布内容以及发布日期等信息。其基本页面结构如下:
resources/views/statuses/_status.blade.php
{{ $user->name }}
{{ $status->content }}
$status 实例代表的是单条微博的数据,$user 实例代表的是该微博发布者的数据。另外你可能还会注意到下面这个方法:
$status->created_at->diffForHumans()
该方法的作用是将日期进行友好化处理。
使用局部视图
resources/views/users/show.blade.php
@extends('layouts.default')
@section('title', $user->name)
@section('content')
@include('shared._user_info', ['user' => $user])
@if (count($statuses) > 0)
@foreach ($statuses as $status)
@include('statuses._status')
@endforeach
{!! $statuses->render() !!}
@endif
@stop
在个人页面视图中,我们使用了 count($statuses) 方法来判断当前页面是否存在微博动态,如果不存在则不对微博的局部视图和分页链接进行渲染。
样式美化
resources/assets/sass/app.scss
.
.
.
/* statuses */
.statuses {
list-style: none;
padding: 0;
margin-top: 20px;
li {
padding: 10px 0;
border-top: 1px solid #e8e8e8;
position: relative;
}
.user {
margin-top: 5em;
padding-top: 0;
}
.content {
display: block;
margin-left: 60px;
word-break: break-word;
img {
display: block;
padding: 5px 0;
}
}
.timestamp {
color: $gray-light;
display: block;
margin-left: 60px;
}
.gravatar {
margin-right: 10px;
margin-top: 5px;
}
form {
button.status-delete-btn {
position: absolute;
right: 0;
top: 10px;
}
}
}
aside {
textarea {
height: 100px;
margin-bottom: 5px;
}
}
.status_form {
margin-top: 20px;
}
生成假数据
生成工厂类文件
$ php artisan make:factory StatusFactory
database/factories/StatusFactory.php
define(App\Models\Status::class, function (Faker $faker) {
$date_time = $faker->date . ' ' . $faker->time;
return [
'content' => $faker->text(),
'created_at' => $date_time,
'updated_at' => $date_time,
];
});
创建Seeder 文件
$ php artisan make:seeder StatusesTableSeeder
database/seeds/StatusesTableSeeder.php
times(100)->make()->each(function ($status) use ($faker, $user_ids) {
$status->user_id = $faker->randomElement($user_ids);
});
Status::insert($statuses->toArray());
}
}
我们通过 app() 方法来获取一个 Faker 容器 的实例,并借助 randomElement 方法来取出用户 id 数组中的任意一个元素并赋值给微博的 user_id,使得每个用户都拥有不同数量的微博。
修改DatabaseSeeder
接下来我们需要在 DatabaseSeeder 类中指定调用微博数据填充文件。
database/seeds/DatabaseSeeder.php
call(UsersTableSeeder::class);
$this->call(StatusesTableSeeder::class);
Model::reguard();
}
}
对数据库进行重置和填充
$ php artisan migrate:refresh --seed