YuHo のブログ

Laravel, PHP, JavaScript

Laravel 5.6 でブログサイトを制作する2 #4 User と Post モデルに関係を付ける

User と Post の所有・所属の関係を作成する

User モデルが Post モデルを所有し、Post モデルが User モデルに所属する、という関係を作ります。

[blog/app/User.php]

<?php

public function posts()
{
    return $this->hasMany('App\Post');
}
[blog/app/Post.php]

<?php

public function user()
{
    return $this->belongsTo('App\User');
}

PostController の編集

作成した User と Post の関係を利用して、Controller の記述を一部簡単にします。

[blog/app/Http/Controller/PostController.php]

<?php

public function index()
{
    $posts = Post::with(['user'])->paginate(10);

    return view('posts.index', ['posts' => $posts]);
}

public function store(Request $request)
{
    $post = new App\Post;

    $post->title = $request->input('title');
    $post->content = $request->input('content');

    $request->user()->posts()->save($post);
}

Blade Template の編集

作成した User と Post の関係を利用して、Blade の内容を付け足します。

users.show

ユーザーのプロフィールページからそのユーザーのポストの一覧を表示します。

[blog/resources/views/users/show.blade.php]

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">User Show</div>

                <div class="card-body">
                    {{ $user->name }}
                </div>
                
                <div class="card-body">
                    @foreach($user->posts as $post)
                    <div><a href="{{ route('posts.show', ['post' => $post->id]) }}">{{ $post->title }}</a></div>
                    @endforeach
                </div>
                
                @can('update', $user)
                    <div class="card-footer text-muted">
                        <a href="{{ route('users.edit', ['id' => $user->id]) }}">EDIT</a>
                    </div>
                @endcan
            </div>
        </div>
    </div>
</div>
@endsection

posts.index

Post のインデックスに著者情報を簡単に追加します。

[blog/resources/views/posts/index.blade.php]

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Post Index</div>

                <div class="card-body">
                    @foreach($posts as $post)
                    <div>
                        <a href="{{ route('posts.show', ['post' => $post->id])}}">{{ $post->title }}</a>
                        <a href="{{ route('users.show', ['user' => $post->user->id]) }}">{{ $post->user->name }}</a>
                    </div>
                    @endforeach
                </div>

            </div>
        </div>
    </div>
</div>
@endsection

posts.show

Post の単体表示ページに著者情報を簡単に追加します。

[blog/resources/views/posts/show.blade.php]

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Post Show</div>

                <div class="card-body">
                    <div>{{ $post->title }}</div>
                    <div><a href="{{ route('users.show', ['user' => $post->user->id]) }}">{{ $post->user->name }}</a></div>
                    <div>{{ $post->content }}</div>
                </div>

            </div>
        </div>
    </div>
</div>
@endsection