我正在努力将一个非常古老的项目迁移到 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/