2017-01-29 35 views
0

cakephp 3でデータベースをシードするときに、外部キーのチェックを無効にし、テーブルを切り捨て、データを挿入し、外部キーのチェックを有効にする方がいいですか?現在動作していない現在のコードcakephpでシードする前にテーブルを切り捨てる

<?php 
use Migrations\AbstractSeed; 
use Cake\Datasource\ConnectionManager; 

/** 
* Categories seed. 
*/ 
class CategoriesSeed extends AbstractSeed 
{ 
    public function run() 
    { 
     $connection = ConnectionManager::get('default'); 
     $connection->execute('SET FOREIGN_KEY_CHECKS = 0'); 
     $connection->execute('TRUNCATE table categories'); 

     $data = [ 
      ['id' => 1, 'name' => 'Audio, video & photo', 'parent' => 0, 'alias' => 'audio-video-and-photo', 'image' => ''], 
      ['id' => 2, 'name' => 'Music players', 'parent' => 1, 'alias' => 'music-players', 'image' => ''], 
      ['id' => 3, 'name' => 'Musical instruments', 'parent' => 1, 'alias' => 'musical-instruments', 'image' => ''], 
     ]; 

     $table = $this->table('categories'); 
     $table->insert($data)->save(); 
     $connection->execute('SET FOREIGN_KEY_CHECKS = 1'); 
    } 
} 

ConnectionManagerを使用する必要はありませんか?これは、たとえばAbstractSeedを使用するだけで可能ですか?

$table = $this->table('categories'); 
$table->query('SET FOREIGN_KEY_CHECKS = 0'); 
$table->truncate(); 

この問題に対処する方法は?

答えて

2

CakePHP接続マネージャを使用すると、新しい別個のデータベース接続が作成されます。つまり、シードに使用されるデータベース接続は影響を受けません。

シードはマイグレーションと同じようにPhinxに基づいているため、単に\Phinx\Seed\AbstractSeed::execute()などのカスタムSQLを実行する機能を使用するだけです。

$this->execute('SET FOREIGN_KEY_CHECKS = 0'); 
$this->execute('TRUNCATE TABLE categories'); 

$table = $this->table('categories'); 
$table->insert($data)->save(); 

$this->execute('SET FOREIGN_KEY_CHECKS = 1'); 

も参照してください

+0

ナイス!ご協力ありがとうございました! –

関連する問題