Laravelでtodoリストを作っています。
メインタスクとそれに紐づくサブタスクを作っています。
サブタスクを作成ー>保存するときにエラーが出ます。
SQLSTATE[HY000]: General error: 1364 Field 'main_task_id' doesn't have a default value (SQL: insert into `tasks` (`title`, `due_date`, `updated_at`, `created_at`) values (ランニング, 2019/11/20, 2019-11-19 12:18:24, 2019-11-19 12:18:24))
コントローラーが
### TaskController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\MainTask; use App\Http\Requests\CreateTask; use App\Task; class taskController extends Controller { public function showCreateForm(int $id) { return view ('tasks/create', [ 'maintask_id' => $id ]); } public function create(int $id, CreateTask $request) { $current_maintask = MainTask::find($id); // dd($current_maintask); $task = Task::create([ 'title' => $request->title, 'due_date' => $request->due_date ]); // $task = new Task(); // $task->title = $request->title; // $task->due_date = $request->due_date; $current_maintask->tasks()->save($task); return redirect()->route('maintasks.index', [ 'id' => $current_maintask->id ]); } public function showEditForm(int $id, int $task_id) { $task = Task::find($task_id); return view('tasks/edit', [ 'task' => $task, ]); } public function edit(int $id, int $task_id, EditTask $request) { $task = Task::find($task_id); $task->title = $request->title; $task->status = $request->status; $task->due_date = $request->due_date; $task->save(); return redirect()->route('tasks.index', [ 'id' => $task->maintask_id, ]); } }
モデルが
### Task.php <?php namespace App; use Illuminate\Database\Eloquent\Model; class Task extends Model { protected $fillable = ['main_task_id','title', 'due_date']; protected $table = "tasks"; public function maintasks() { return $this->belongsTo('App\MainTask'); } // protected $attributes = [ // "main_task_id" => "(default value)", // ]; /** * 状態定義 */ const STATUS = [ 1 => ['label' => '未着手'], 2 => ['label' => '着手中'], 3 => ['label' => '完了'], ]; /** * 状態のラベル * @return string */ public function getStatusLabelAttribute() { // 状態値 $status = $this->attributes['status']; // 定義されていなければ空文字を返す if (!isset(self::STATUS[$status])) { return ''; } return self::STATUS[$status]['label']; } }
特にサブタスクのコントローラーのcreateメソッドを見てほしいのですが
// $task = new Task(); // $task->title = $request->title; // $task->due_date = $request->due_date;
の処理だとうまく保存できるのですが、
$task = Task::create([ 'title' => $request->title, 'due_date' => $request->due_date ]);
のEloquentの処理だと最初に書いたSQLSTATE[HY000]: General error: 1364 Field 'main_task_id' doesn't have a default value (SQL: insert into tasks
(title
, due_date
, updated_at
, created_at
) values (ランニング, 2019/11/20, 2019-11-19 12:18:24, 2019-11-19 12:18:24))のエラーが出てしまいます。
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateMainTasksTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('main_tasks', function (Blueprint $table) { $table->increments('id'); $table->string('title', 20); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('main_tasks'); } }
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateTaskstable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('tasks', function (Blueprint $table) { $table->increments('id'); $table->integer('main_task_id')->unsigned(); $table->string('title', 100); $table->date('due_date'); $table->integer('status')->default(1); $table->timestamps(); // 外部キーを設定する $table->foreign('main_task_id')->references('id')->on('main_tasks'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('tasks'); } }
色々とググりながら様々な資料を見て確認したのですがなかなか解決できず
database.phpのstrictをtureからfalseに変えてもだめでした。
あと、dd($current_maintask);をして、maintaskのidは取得できたのに、$current_maintask->tasks()->save($task);に行くとデータが入ってないみたいです。
コメントアウトした属性ー>saveメソッドはうまく保存できたのに、createメソッドだとなぜ上手く行かないのか?
また、どういった処理になっているのかわからないので
ご回答のほうをよろしくお願いします。
回答2件
あなたの回答
tips
プレビュー