前提・質問したいこと
PHP・Laravelでいいね、編集、削除ができる投稿機能を作っています。
いいね機能の中間テーブル、モデルを実装中に以下のエラーメッセージが発生しました。
何が原因でしょうか?
マイグレーションファイルを作り直したほうがいいですか?
発生している問題・エラーメッセージ
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'title' in 'field list' (SQL: insert into `posts` (`user_id`, `title`, `content`, `updated_at`, `created_at`) values (1, aaa, nnn, 2021-08-08 07:56:01, 2021-08-08 07:56:01))
該当のソースコード
以下がエラーメッセージで指摘されているテーブルのマイグレーションファイルです。
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreatePostsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('posts', function (Blueprint $table) { $table->bigIncrements('id'); $table->integer('user_id'); $table->string('title',255)->change(); $table->string('content',255)->change(); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('posts'); } }
以下のいいね機能のための中間テーブル、モデル作成時にエラーが出ました。
中間テーブル
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateLikesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('likes', function (Blueprint $table) { $table->bigIncrements('id'); $table->bigInteger('user_id')->unsigned(); $table->bigInteger('post_id')->unsigned(); $table->timestamps(); $table->foreign('user_id')->references('id')->on('users')->cascadeOnDelete(); $table->foreign('post_id')->references('id')->on('posts')->cascadeOnDelete(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('likes'); } }
Likeモデル
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Like extends Model { protected $table = 'likes'; public function user() { return $this->belongTo('App\Models\User'); } public function post() { return $this->belongTo('App\Models\Post') } protected $fillable = [ 'user_id','post_id' ]; protected $guarded = [ 'id' ]; }
Userモデル(追加・変更部分)
protected $primaryKey = "id"; (略) public function posts() { return $this->hasMany('App\Models\Post'); } public function likes() { return $this->hasMany('App\Models\Nice'); }
Postモデル(追加・変更部分)
public function likes() { return $this->hasMany('App\Models\Like'); } public function getData() { return $this->id . ':' . $this->title . $this->content; }
また、mysqlでカラムを確認した際にもtitleとcontentカラムは存在しないようでした。
mysql> show columns from posts; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | user_id | int(11) | NO | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +------------+---------------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec)
補足情報(FW/ツールのバージョンなど)
Windows10pro
docker Version:20.10.7
Laravel Framework 8.50.0