【问题标题】:Laravel/Composer: adding seeds programmaticallyLaravel/Composer:以编程方式添加种子
【发布时间】:2016-12-29 22:04:24
【问题描述】:

目前我正在尝试使用以下工作流程开发包更新系统。 我正在创建一个包含以下文件的包 (.zip):

  • 迁移(文件夹)
    • 迁移类
    • ..
  • 种子
    • 种子文件
    • ..
  • package.xml
  • UpdateInstructionSeeder.php

作为管理员,我可以在我的管理控制面板中上传这个包来更新我的数据库。

后端工作流程:

  1. 从 package.xml 中获取数据(获取可用的种子和迁移)
  2. 检查是否需要迁移/播种
  3. 迁移(工作正常)
  4. 种子(失败)

所以,如您所见,我的播种有些问题。

起初我尝试将我的种子(使用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 composer-php laravel-5.1


    【解决方案1】:

    试试

    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运行它

    优化.sh


    php artisan optimize
    php artisan cache:clear 
    chmod -R guo+w storage
    composer dump-autoload
    

    https://laravelcollective.com/docs/5.0/ssh

    【讨论】:

    • 喜欢这个? gist.github.com/anonymous/3baece51cf7211fce80dcb899a230542 它不起作用 :( 但老实说:我从互联网上复制了 exec() 部分。这是转储自动加载器的正确方法吗?
    • 您可以制作一个 .sh 文件并放置所有这些命令,然后可以以编程方式运行 .sh 文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 2021-08-23
    相关资源
    最近更新 更多