Laravel4 在测试环境中使用 SQLite 失败,而使用 mysql 成功


Laravel4 Seeding in testing environment fails using SQLite, while succeeds using mysql

简而言之:种子在mysql上工作正常,而在sqlite上中断。损坏的代码就像DB::table('user')->insert($users);

种子代码:

<?php
public function run() {
    DB::table('user')->delete();
    $users = array();
    $birth = new DateTime('1980-03-12');
    while ($i++ < 50) {
        $users[$i]['email'] = "mail$i@example.com";
        $users[$i]['password'] = User::password('test');
        $users[$i]['enabled'] = 1;
        $users[$i]['name'] = 'Name';
        $users[$i]['surname'] = 'Surname';
        $users[$i]['birthDate'] = $birth;
    }
    DB::table('user')->insert($users); //<- This line is broken when using sqlite.
}

的默认数据库驱动程序是 mysql,现在我正在尝试切换到 sqlite 用于测试环境。所以,在

应用程序/配置/测试/数据库.php

我在"连接"中有这个配置("默认"键是"SQLITE"(

'sqlite' => array(
            'driver'   => 'sqlite',
            'database' => ':memory:',
            'prefix'   => '',
        ),

现在,如果我发出

PHP工匠迁移--种子,这工作正常。

如果我发出

php artisan migrate --seed --env=testing,这不起作用

上面的DB::table('user')->insert($users);失败了,事实上,当我评论播种工作正常时。命令行中的错误是

错误异常","消息":"array_keys(( 期望参数 1 为 数组,空给定 [...] /laravel/framework/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php","line":52

这是怎么回事?

查看第 52 行,我们发现:

$names = $this->columnize(array_keys($values[0]));

这是用来构建查询的列列表部分(INSERT INTO (column1, column2) VALUES... (

$values在您的情况下是$users,但它没有0索引。为什么? while ($i++ < 50)在进入循环体之前递增$i,因此$users的第一个索引将被1,而不是像LaravelSQLite insert实现需要的那样0

像这样修复它:

$i = 0;
while ($i < 49) {
    ...
    $i++;
}

为什么MySQL实现有效?这是此实现中相应行的样子:

$columns = $this->columnize(array_keys(reset($values)));