显示微博

获取微博

取出一个用户的所有微博可以通过以下方式:

$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 }} {{ $user->name }} {{ $status->created_at->diffForHumans() }} {{ $status->content }}
  • $status 实例代表的是单条微博的数据,$user 实例代表的是该微博发布者的数据。另外你可能还会注意到下面这个方法:

    $status->created_at->diffForHumans()

    该方法的作用是将日期进行友好化处理。

    使用局部视图

    resources/views/users/show.blade.php

    @extends('layouts.default')
    @section('title', $user->name)
    @section('content')
    
    @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

    你可能感兴趣的:(显示微博)