Laravel 4播种许多行,工匠停止

时间:2014-03-26 09:21:06

标签: 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)将只从我的旧表中获取一些值。它似乎有一个运行时间阻止它为所有行做循环,但我看不到任何消息,它只是平原停止,当我检查数据库时,除了插入的行数之外,一切似乎都是正确的(I&#39;我失踪了几千,这是一个庞大的数据库)。

也许这不应该是这样做的方式,但到目前为止看起来它似乎对这项工作有效,除了这个问题。如何在更长的时间内运行命令?

2 个答案:

答案 0 :(得分:1)

要查找发生了什么,为什么不抛出错误? 尝试把你的代码放在事务中,所有这些魔法都会发生在你身上......

DB::transaction(function(){

 //transaction_code_here

 });

顺便说一下,迁移完成后,您可以运行所需的特定种子:

php artisan db:seed --class=CallsTableSeeder 

你可以截断Calls表,这样就可以清除它并重置autoincrement!

表示将代码更改为:

<?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- truncate(&#34; reset&#34;)你&#34;来电&#34;表

2-运行您的插入DB :: table(&#39;调用&#39;) - &gt; insert($ calls);    在事务内部,这样一来,如果发生错误,它不仅不会提交更改,而且会因发生错误而抛出异常!

希望这有帮助!

干杯!

答案 1 :(得分:0)

你可能已经有一些超时...你可以尝试为你的PHP超时set_time_limit(3600);(1小时)添加更多时间,但是如果它不够,那就更难了(可能添加一个字段)到您的数据库“is_migrated”,并使用队列系统)

出于好奇,像

这样的简单解决方案
insert into db2.table1 (field1, field2, field3)
select field1, field2, field3 from db1.table1

不起作用?应该真的更快......