Laravel/Composer:以编程方式添加种子
Laravel/Composer: adding seeds programmatically
目前我正在尝试使用以下工作流程开发一个包更新系统。
我正在创建一个包含以下文件的包 (.zip):
- 迁移(文件夹)
- 迁移类
- ..
- 种子
- 种子文件
- ..
- package.xml
- UpdateInstructionSeeder.php
作为管理员,我可以在我的管理控制面板中上传这个包来更新我的数据库。
后端工作流程:
- 从 package.xml 获取数据(获取可用的种子和迁移)
- 检查是否需要 migration/seeding
- 迁移(工作正常)
- 种子(失败)
因此,如您所见,我在播种方面遇到了一些问题。
起初我尝试将我的种子从包种子文件夹移动(使用 Storage::move()
)到 database/seed/
目录。
我试图用 Artisan::call('db:seed','--class']);
为它播种,但出现了 Class MyClass does not exist
错误。
我猜我的自动加载器有一些问题,所以我试着用 system('composer dump-autoload', $test);
来转储它。 $test
的输出是 1
但 autoload_classmap
没有更新。
现在我添加了一个 UpdateInstructionSeeder.php
,它在我的框架中默认可用,用于修复自动加载器问题。
上传我的包后,我现在正在使用 Storage::get()
和 Storage::put()
用我需要的种子更新它。
然后我用 Artisan::call('make:seeder', ['name' => $className]);
添加种子($className 是我的种子在包中的名称)并用 Storage::get()
和 Storage::put()
更新它们。
最后,我用 Artisan::call('db:seed','--class' => 'UpdateInstructionSeeder']);
调用我的播种机。结果:
Class MyClass does not exist
内容:
软件包 UpdateInstructionSeeder
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class UpdateInstructionSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Model::unguard();
$this->call(DemoTableSeeder::class);
Model::reguard();
}
}
打包 DemoTableSeeder
<?php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class DemoTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Model::unguard();
DB::table('demos')->insert([
[
'demoInt' => 1,
'demoString' => "a"
],
[
'demoInt' => 11,
'demoString' => "aa"
],
]);
Model::reguard();
}
}
我现在浪费了很多时间,我完全不知道如何以编程方式解决这个问题。
尝试
php artisan optimize
php artisan cache:clear
chmod -R guo+w storage
composer dump-autoload
然后终于
php artisan db:seed
您可以使用 Artisan::call 以编程方式调用所有这些命令,如下所示
Artisan::call('optimize', ['--quiet' => true, '--force' => true]);
编辑
制作一个包含以下内容的 .sh
文件并 运行 使用 php
optimize.sh
php artisan optimize
php artisan cache:clear
chmod -R guo+w storage
composer dump-autoload
目前我正在尝试使用以下工作流程开发一个包更新系统。 我正在创建一个包含以下文件的包 (.zip):
- 迁移(文件夹)
- 迁移类
- ..
- 种子
- 种子文件
- ..
- package.xml
- UpdateInstructionSeeder.php
作为管理员,我可以在我的管理控制面板中上传这个包来更新我的数据库。
后端工作流程:
- 从 package.xml 获取数据(获取可用的种子和迁移)
- 检查是否需要 migration/seeding
- 迁移(工作正常)
- 种子(失败)
因此,如您所见,我在播种方面遇到了一些问题。
起初我尝试将我的种子从包种子文件夹移动(使用 Storage::move()
)到 database/seed/
目录。
我试图用 Artisan::call('db:seed','--class']);
为它播种,但出现了 Class MyClass does not exist
错误。
我猜我的自动加载器有一些问题,所以我试着用 system('composer dump-autoload', $test);
来转储它。 $test
的输出是 1
但 autoload_classmap
没有更新。
现在我添加了一个 UpdateInstructionSeeder.php
,它在我的框架中默认可用,用于修复自动加载器问题。
上传我的包后,我现在正在使用 Storage::get()
和 Storage::put()
用我需要的种子更新它。
然后我用 Artisan::call('make:seeder', ['name' => $className]);
添加种子($className 是我的种子在包中的名称)并用 Storage::get()
和 Storage::put()
更新它们。
最后,我用 Artisan::call('db:seed','--class' => 'UpdateInstructionSeeder']);
调用我的播种机。结果:
Class MyClass does not exist
内容:
软件包 UpdateInstructionSeeder
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class UpdateInstructionSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Model::unguard();
$this->call(DemoTableSeeder::class);
Model::reguard();
}
}
打包 DemoTableSeeder
<?php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class DemoTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Model::unguard();
DB::table('demos')->insert([
[
'demoInt' => 1,
'demoString' => "a"
],
[
'demoInt' => 11,
'demoString' => "aa"
],
]);
Model::reguard();
}
}
我现在浪费了很多时间,我完全不知道如何以编程方式解决这个问题。
尝试
php artisan optimize
php artisan cache:clear
chmod -R guo+w storage
composer dump-autoload
然后终于
php artisan db:seed
您可以使用 Artisan::call 以编程方式调用所有这些命令,如下所示
Artisan::call('optimize', ['--quiet' => true, '--force' => true]);
编辑
制作一个包含以下内容的 .sh
文件并 运行 使用 php
optimize.sh
php artisan optimize
php artisan cache:clear
chmod -R guo+w storage
composer dump-autoload