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) {
// ...省略...
}
}
2022-05-30 09:00:00
