我正在使用:
我需要将数据从一个数据库移动到另一个数据库。我所做的是编译一个大型查询,将我需要的所有数据联合起来并在我在Laravel结构中创建的PHP脚本中运行它。然后我使用Eloquent迭代结果插入MySQL。我知道这很糟糕,但为了做到这一点,我不得不删除PHP的内存和时间限制,虽然花了很长时间,但它确实有效!
现在我意识到我错过了一些东西,我需要重新运行类似的查询(产生相同数量的行),但这次只是在MySQL DB上添加一个字段。
我的问题是,如何优化此流程?我正在考虑使用块,但我不知道如何使用块。
澄清:
如果我向您展示我的代码,可能会更容易。
答案 0 :(得分:2)
您可以使用eloquent来执行此操作。以下是我的工作方式(未经测试,可能需要进行一些调整):
在config\database.php
中设置两个数据库连接。
为同一资源制作两个模型(您只能使用一个模型,但我不愿意),我将它们命名为M1
和M2
,具有不同的连接属性。为此,请在模型中创建一个属性:protected $connection = 'connection_name'
。
基本上是这样的:
class M1 extends Model {
protected $connection = 'connection_name';
protected $table = 'table_name';
protected $guarded = [];
具有不同$connection
的M2相同。
现在,在您的控制器方法或您执行代码的任何地方,您都可以使用雄辩的方式查询查询:
//assuming you are transferring M1's db to M2's
M1::chunk(200, function($m1s) //if you wanna use only one model, this should be M1::on('connection-name')->chunk(...
{
foreach ($m1s as $m1)
{
$m2 = new M2();
//this does not copy model-specific attributes like $connection
$m2->fill( $m1->getAttributes() );
$m2->save();
}
});
我认为这样做,你能测试一下吗?