Ikeda's Blog

Laravelでブログサイトを作る 20. DBに後からカラムを追加する

目的

記事に、Meta用の項目"Description"を設定できるようにしたい。
(設計する時に考慮しきれなかった部分に対応する)

migration

migrationファイルの作成

サーバに入り、コマンドを実行します。

  • meta情報を追加するので、ファイルの名前は"add_meta_to_article"にします。
  • --table=で、追加するテーブルを指定します。
php artisan make:migration add_meta_to_article --table=articles

migrationファイルの内容を記述

database/migrations/XXXX_XX_XX_XXXXXX_add_meta_to_article.php
テーブル作成の時と同様に、up()に追加する項目を記述します。

// ...省略...
    public function up()
    {
        Schema::table('articles', function (Blueprint $table) {
            $table->text('description');  // 追加:ディスクリプション
        });
    }
// ...省略...

migration実行

php artisan migrate

これで、テーブルにカラムが追加されました。

テンプレートの修正

記事編集画面

resources/views/admin/articleEdit.blade.php
編集画面に、それぞれの入力欄を設置します。

// ...省略...
<form action="{{ route('admin_article_update') }}" method="post">
    // ...省略...
    <h3>Description</h3>
    <input type="text" name="description" value="{{ $articleData->description ?? '' }}" />
    // ...省略...
</form>
// ...省略...

共通テンプレート

resources/views/app.blade.php
headタグ内に、@yield('meta')だけ記載することで、各テンプレートでMetaタグを自在に設定できるようになります。
存在しない場合は、何も表示されませんので、既存のテンプレートを修正しなくてもエラーが出たりはしないので、必要な箇所にのみ記述するだけで良いのです。

<head>
    // ...省略...

    @yield('meta')

    // ...省略...
</head>

記事の表示画面

resources/views/front/article.blade.php

// ...省略...

@section('meta')
    <meta name="description" content="{{ $articleData->description }}" />
@endsection

// ...省略...

Controller

記事編集

app/Http/Controllers/ArticleController.php
入力されたDescriptionを取得して、テーブルに保存します。
なお、未入力であれば、記事の冒頭100文字を抽出して保存するようにします。


    /**
     * 記事情報更新
     *
     * @param Request $request
     * @return mixed
     */
    public function update(Request $request)
    {
        // 入力値取得
        $id = $request['id'];
        $tiitle = $request['title'];
        $body = $request['body'];
        $parent = $request['parent'];
        $childList = $request['child'];
        $open = $request['open'];
        $private = $request['private'];
        $description = $request['description'] ?? mb_substr(strip_tags($body), 0, 100);

        // ...省略...

        // トランザクション開始
        DB::beginTransaction();

        try {
            // 記事データ保存
            $articleData = $this->article->withTrashed()->where('id', $id)->first();
            if ($articleData === null) {
                $articleData = new Article();
            }
            $articleData->title = $tiitle;
            $articleData->body = $body;
            $articleData->parent = $parent;
            $articleData->open = $open;
            $articleData->private = $private;
            $articleData->description = $description;
            $articleData->save();

            // ...省略...
        } catch (\Exception $e) {
            // ...省略...
        }
    }