min*_*nce 7 data-migration database-migration conceptual laravel
Laravel 附带了数据库迁移,用于管理有关数据库结构的CRUD 操作,但是处理实际数据迁移的适当/推荐/标准化方法是什么?
我的问题是,数据迁移是否应该直接在数据库迁移文件中进行?应该是播种机吗?它应该是从数据库迁移中分派的作业吗?这样的逻辑该何去何从。有时,根据数据库迁移的作用,这些数据迁移会变得异常复杂,本着最大化可读性和保持职责分离的精神,我觉得逻辑属于其他地方。
我想,这个问题更多地归因于 OOP 编程结构和整个实践,而不是 Laravel 特定的,但 Laravel 是我现在正在使用的框架,因此在这方面提出了我的问题。
小智 9
我已经这样做了几次,除非我们谈论的是数百万条记录,否则我会在迁移up()和down()功能中这样做。我同意你的看法,感觉在迁移中应该有一个明确定义的功能。我们希望在触发表上的另一个迁移之前更改数据,所以我觉得需要立即完成。
使用你的例子,这是一个简单的迁移将是什么样子的分裂name成first_name和last_name的up()功能:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;
class Test extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('last_name')->after('name');
$table->string('first_name')->after('name');
});
DB::statement("UPDATE users SET first_name = SUBSTRING_INDEX(name, ' ', 1), last_name = SUBSTRING(name from instr(name, ' ') + 1)");
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('name');
});
}
...
Run Code Online (Sandbox Code Playgroud)
如果您有复杂的数据更改,请查看$table->temporary();创建临时表以使用 SQL 进行数据操作的选项,和/或使用Artisan::call().
$table->temporary():https
Artisan::call() : //laravel.com/docs/8.x/migrations#database-connection-table-options:https : //laravel.com/docs/8.x/artisan#programmatically-executing-commands
| 归档时间: |
|
| 查看次数: |
333 次 |
| 最近记录: |