2017-04-20 28 views
0

私は参照データを使ってMySQLデータベースをシードしようとしています。Nullable外部キーのLaravelシード

public function up() 
{ 
    Schema::create('groups', function (Blueprint $table) { 
     $table->engine = 'InnoDB'; 
     $table->increments('id'); 
     $table->integer('parent_group_id')->unsigned()->nullable(); 
     $table->foreign('parent_group_id')->references('id')->on('groups'); 
     $table->string('value'); 
     $table->softDeletes(); 
    }); 
} 

問題はNULLとして外部キーとシードしようとしている:私は難しさを持っています特定のテーブルには、私のマイグレーション機能ごとに、親/子関係を表すために、同じテーブルにマップNULL可能外部キーを持っていますトップレベルの行に表示されます。挿入した行のいずれかにそのフィールドを含めないと、シードは期待どおりに動作します。私は一人っ子行にフィールドを追加すると、それは、として、すべての行とエラーうちに同じフィールドカウントを期待:

[PDOException] 
SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column 
count doesn't match value count at row 2 

私はNULLに値をシードする方法上の任意の参照を見つけることができませんでした。私が解決した最後の試みは次のとおりでした:

<?php 

use Illuminate\Database\Seeder; 

class GroupsTableSeeder extends Seeder 
{ 
    /** 
    * Run the database seeds. 
    * 
    * @return void 
    */ 
    public function run() 
    { 
     DB::table('groups')->insert([ 
      [ 
       'parent_group_id' => [NULL], 
       'value' => 'Group1' 
      ], 
      [ 
       'parent_group_id' => 1, 
       'value' => 'Subgroup1' 
      ], 
      [ 
       'parent_group_id' => 2, 
       'value' => 'Subgroup2' 
      ] 
     ]); 
    } 
} 

Array to string conversionにはどのエラーが出力されましたか。

'[NULL]'General error: 1366 Incorrect integer valueに設定するとエラーが発生します。私は他のバリエーションを試みましたが、運はありません。シードにNULL値を挿入する正しい方法は何ですか?どんな助けもありがたい。よろしくお願いします。

答えて

1

PHPのnullの値を使用するだけでLaravelはデータベースのnull値に変換するのに十分です。

DB::table('groups')->insert([ 
    [ 
     'parent_group_id' => null, 
     'value' => 'Group1' 
    ], 
    [ 
     'parent_group_id' => 1, 
     'value' => 'Subgroup1' 
    ], 
    [ 
     'parent_group_id' => 2, 
     'value' => 'Subgroup2' 
    ] 
]); 

[を使用して、あなたがそのエラーを取得する理由]あなたがPHPの配列を作成し、それがあります。

+0

私はこれを試したことを誓いますが、私は別のエラーでそれを包み込んでいるかもしれません。これで私の問題は解決しました。ありがとうございました – nbayly