課題2020-09

ログイン機能を有した掲示板システムを開発します。
ログイン機能はLaravelが提供する標準ログイン機能を使います。

テーブル定義

記事テーブル

  • ID
  • ユーザID
  • タイトル
  • 内容
  • 登録日時
  • 更新日時

ユーザテーブル (Laravel標準のusersテーブルを利用)

  • ID
  • 名前
  • メールアドレス
  • パスワード

画面設計

解答例

マイグレーション

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateArticlesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->integer('user_id');
            $table->string('title', 100);
            $table->string('contents', 1000);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('articles');
    }
}

ルーティング

Route::get('/articles', 'ArticlesController@index');
Route::get('/articles/create', 'ArticlesController@create');
Route::post('/articles', 'ArticlesController@store');

コントローラ

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\ArticleRequest;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;

class ArticlesController extends Controller
{
    function __construct() {
        $this->middleware('auth');
    }

    public function index() {
        $articles = DB::select('select id, title, user_id, created_at from articles;');

        $users = [];
        foreach($articles as $index => $article) {
            $user = DB::select('select name from users where id = ?;', [
                $article->user_id
            ]);
            $users[$index] = $user[0];
        }

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

    public function create() {
        return view('articles.create');
    }

    public function store(ArticleRequest $request) {
        DB::insert('insert into articles(user_id, title, contents, created_at, updated_at) values(?, ?, ?, ?, ?);', [
            Auth::user()->id,
            $request->title,
            $request->contents,
            now(),
            now()
        ]);
        return redirect('/articles');
    }
}

リクエスト

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ArticleRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'title' => 'required|max:100',
            'contents' => 'required|max:1000'
        ];
    }
}

ビュー

<html>
<body>
<a href="/articles">戻る</a>
@if($errors->any())
<ul>
    @foreach($errors->all() as $error)
    <li>{{ $error }}</li>
    @endforeach
</ul>
@endif
<form method="POST" action="/articles">
    @csrf
    <p>
        タイトル<br>
        <input type="text" name="title">
    </p>
    <p>
        内容<br>
        <textarea cols="50" rows="7" name="contents"></textarea>
    </p>
    <p>
        <input type="submit" value="投稿">
    </p>
</form>
</body>
</html>
<html>
<body>
<a href="/articles/create">新規投稿</a>
<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>タイトル</th>
            <th>投稿者名</th>
            <th>投稿日時</th>
        </tr>
    </thead>
    <tbody>
        @foreach($articles as $index => $article)
        <tr>
            <td>{{ $article->id }}</td>
            <td>{{ $article->title }}</td>
            <td>{{ $users[$index]->name }}</td>
            <td>{{ $article->created_at }}</td>
        </tr>
        @endforeach
    </tbody>
</table>
</body>
</html>

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Laravel

前の記事

ログイン機能を実装する
SQL

次の記事

結合(JOIN)