在cakephp播种前截断表

时间:2017-01-29 07:24:52

标签: php cakephp cakephp-3.0

我想知道是否有更好(更顺畅)的方法来禁用外键检查,截断表,插入数据并在使用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();

你处理这个问题的方法是什么?

1 个答案:

答案 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');

另见