【发布时间】:2019-11-18 18:34:21
【问题描述】:
我的上级告诉我,我可以创建一个seeder 类似trait,然后我可以在migration 中使用它。在服务器上运行迁移时,数据库会在迁移时自动播种,而不是在迁移成功后运行单独的播种器。
现在我创建了一个包含在数据库迁移中的特征。
<?php
namespace App\Services;
use App\Models\Module\Module;
use App\Models\Plan\Plan;
/**
* PlanAndModuleGenerator class.
*/
trait PlanAndModuleGenerator
{
private static $plans = [
'free',
'basic',
'premium',
];
public function up()
{
foreach ($this->plans as $planName) {
// Get or create Plan.
$plan = Plan::create([
'machine_name' => '',
'name' => $planName
]);
}
}
}
我的上级告诉我他们以前这样做过,但我在互联网上找不到类似的东西。我把我的特质包括在内。
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use App\Services\PlanAndModuleGenerator;
class ModulePlan extends Migration
{
use PlanAndModuleGenerator;
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('module_plan', function (Blueprint $table) {
$table->unsignedInteger('plan_id');
$table->unsignedInteger('module_id');
$table->foreign('plan_id')->references('id')->on('plans');
$table->foreign('module_id')->references('id')->on('modules');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('module_plan');
}
}
当我运行迁移时,trait 中的 up 函数不会执行。我知道这一点是因为 Plan 表尚未播种。关于我如何解决这个问题的任何想法?由于我的上级在接下来的几天里不在办公室,我无法访问他们之前执行此操作的存储库。
除此之外,谁能告诉我如何正确调试此特征?我现在这样做的方式,只是运行迁移并等待错误,似乎有点麻烦。
【问题讨论】:
-
它没有运行,因为您通过在使用 trait 的类上定义
up方法来覆盖它......看看 trait 是如何工作的:PHP Manual - OOP - Traits - Precedence
标签: laravel database-migration traits