php - Laravel 4 播种多行, artisan 停止

标签 php mysql laravel laravel-4

我正在努力将一个非常古老的项目迁移到 Laravel,我考虑过将包含我的旧内容的数据库播种到新数据库中。

这是我如何为我的一张表执行此操作的示例:

<?php

class CallsTableSeeder extends Seeder {

    public function run()
    {
        $hostname = 'localhost';
        $username = 'root';
        $password = 'root';
        $link = mysql_connect($hostname, $username, $password);
        mysql_select_db('olddatabase');

        $callselect = 'SELECT * FROM calls';
        $ressource = mysql_query($callselect);

        $calls = array();

        while($item = mysql_fetch_object($ressource))
        {
            $calls['id']=$item->id;
            $calls['author_name']=$item->author_name;
            $calls['comments']=$item->comment;
            DB::table('calls')->insert($calls);
        }


    }
}

在我的 DatabaseSeeder.php 中我有:

<?php

class DatabaseSeeder extends Seeder {

    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Eloquent::unguard();

        DB::statement('SET FOREIGN_KEY_CHECKS=1;');

        $this->call('MembersTableSeeder');
        $this->command->info('The Members table has been seeded!');
        $this->call('ContactsTableSeeder');
        $this->command->info('The Contacts table has been seeded!');
        $this->call('CallsTableSeeder');
        $this->command->info('The Calls table has been seeded!');
        $this->call('ClientsTableSeeder');
                    //and so on
    }

}

问题是,当我执行 php artisan migrate:refresh --seed 时,我完成了迁移并为第一个表(它只有 8 行)提供了种子消息,但没有别的。该命令似乎在一段时间后停止,第二个表 (Calls) 只会从我的旧表中获取一些值。它似乎有一个运行时间阻止它对所有行进行循环,但我看不到任何消息,它只是简单地停止,当我检查数据库时,除了插入的行数之外,一切似乎都是正确的(我丢失了几千,这是一个很大的数据库)。

也许这不应该是执行此操作的方法,但到目前为止,除了这个问题外,它似乎对这项工作有用。如何长时间运行命令?

最佳答案

要找出发生了什么,为什么不抛出错误?? 尝试将您的代码放入事务中,所有魔法都会为您发生...

DB::transaction(function(){

 //transaction_code_here

 });

顺便说一句,在迁移完成后,您可以通过以下方式运行您想要的特定种子:

php artisan db:seed --class=CallsTableSeeder 

而且您可以截断 Calls 表,因此它会清理它并重置自动增量!

意味着将您的代码更改为:

<?php

class CallsTableSeeder extends Seeder {

    public function run()
    {
        $hostname = 'localhost';
        $username = 'root';
        $password = 'root';
        $link = mysql_connect($hostname, $username, $password);
        mysql_select_db('olddatabase');

        $callselect = 'SELECT * FROM calls';
        $ressource = mysql_query($callselect);

        $calls = array();


     DB::table('calls')->truncate(); //ADDED BY ME 

     DB::transaction(function(){ //ADDED BY ME

        while($item = mysql_fetch_object($ressource))
        {
            $calls['id']=$item->id;
            $calls['author_name']=$item->author_name;
            $calls['comments']=$item->comment;
            DB::table('calls')->insert($calls);
        }


     }); //ADDED BY ME



    }
}

然后你可以运行我上面写的 artisan 命令,这将:

1- 截断(“重置”)您“调用”表

2- 运行你的插入 DB::table('calls')->insert($calls); 在一个事务中,这样,如果发生错误,它不仅不会提交更改,还会抛出发生错误的异常!

希望这对您有所帮助!

干杯!

关于php - Laravel 4 播种多行, artisan 停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22656377/

相关文章:

PHP:从多个来源填充数组

php - Paypal 批量支付 API

php - 如何使用 PHP 将 MySQL 数据库备份到电子邮件

mysql - 如何使用mysql查找第一个非空列名

mysql - 如何在 Laravel SQL 查询中一起使用 `GroupBy` 和 `join`

javascript - 如何使整个 <tr> 行在 laravel 中可点击?

php - 在php中输出原始二进制整数

php Spreadsheet_Excel_Reader 数据插入 mysql 数据库时包含不需要的 �

MySQL 索引 : inverted or forward

php - Laravel 如何 Isset _GET