我想知道是否有更好(更顺畅)的方法来禁用外键检查,截断表,插入数据并在使用cakephp 3对数据库进行种子设定时启用外键检查。这是我当前的代码,它是不工作
<?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();
你处理这个问题的方法是什么?
答案 0 :(得分: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');
另见