【问题标题】:Database Seeders not working in Laravel数据库播种机在 Laravel 中不起作用
【发布时间】:2016-01-20 04:10:06
【问题描述】:

我的目标是根据每 24 小时更改一次的 CSV 文件填充我的数据库。我的理解是 Seeders 非常适合这个,甚至可以根据需要以编程方式调用。我整理了基本代码并使用了他们网站上的文档,但是它失败了,即使启用了调试,错误消息也没有什么意义。

我已经测试并确认数据库连接正常工作,还注释掉了除“Truncate”行之外的所有 Seeder 代码,遗憾的是,它似乎甚至没有被处理。如果我从它工作的路线内截断,从播种机的run() 截断它不会。

我该如何解决或至少解决这个问题?

路线:

Route::get('seed', function()
{
    Artisan::call('db:seed');
});

播种机:

<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        // Empty the 'PLAYERS' Table
        DB::table('players')->truncate();

        // Fetch the data from our CSV File
        $data = $this->seedFromCSV('export.csv', ',');

        foreach ($data as $player)
        {
            DB::table('players')->insert(
                [
                    'name' => $player['First Name'] . " " . $player['Last Name'],
                    'team' => '0',
                    'position' => '0',
                    'played' => $player['Played'],
                    'injury_status' => $player['Injury Indicator'],
                    'injury_type' => $player['Injury Details'],
                    'fd_salary' => $player['Salary'],
                    'fd_fppg' => $player['FPPG'],
                    'opponent' => '0'
                ]
            );
        }
    }

    private function seedFromCSV($filename, $deliminator = ",")
    {
        if(!file_exists($filename) || !is_readable($filename))
        {
            return FALSE;
        }

        $header = NULL;
        $data = array();

        if(($handle = fopen($filename, 'r')) !== FALSE)
        {
            while(($row = fgetcsv($handle, 1000, $deliminator)) !== FALSE)
            {
                if(!$header) {
                    $header = $row;
                } else {
                    $data[] = array_combine($header, $row);
                }
            }
            fclose($handle);
        }

        return $data;
    }

}

错误:

FatalErrorException in compiled.php line 2057:
Maximum execution time of 30 seconds exceeded

【问题讨论】:

  • 为什么要调用特殊路由来为数据库做种?为什么不用cli命令php artisan db:seed
  • 我在共享主机上,Laravel 是通过 Softaculous 安装的。我无法运行直接命令,因为我没有权限这样做。

标签: php database laravel model


【解决方案1】:

您的 DatabaseSeeder 类中缺少 DB 外观的导入。

添加这个:

use Illuminate\Support\Facades\DB;

【讨论】:

  • 感谢您的建议。但是,我刚刚对其进行了测试,但它仍然超时并显示相同的错误消息。是否有可能获得更多有关实际导致失败的信息的详细信息?
  • truncate 现在应该可以工作了...也许脚本有时需要超过 30 秒才能运行,因此请尝试更改您的 php.ini 中的 max_execution_time
  • 嗯,遗憾的是,该日志似乎与浏览器中显示的内容相同。我怀疑它需要更长的时间,实际上有 1 个 DB 条目,并且 DB 在 localhost 上。从其他任何地方(例如 Route、Controller 等)运行 truncate() 行会立即完成。
  • 运行 composer dump-autoload
  • 所以在认输之后,我用 shell_exec('cd ../laravel && php artisan db:seed'); 测试了 CLI 命令。看起来它会起作用,但会报告生产中的应用程序!命令取消!我需要 cd 到 public_html 下的 laravel 目录或该消息与为什么它不能以编程方式工作有关吗?
【解决方案2】:

这是由于 Laravel 的 Seeders 无法在生产环境中运行,从而导致它超时。为了解决这个问题,可以将 force 参数作为 true 传递,它会按预期完成。

Artisan::call('db:seed', array('--class' => 'DatabaseSeeder', '--force' => true));

【讨论】:

  • 无论你现在在哪里,上帝保佑你,非常感谢你的最佳回答,你拯救了我的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 2014-03-01
相关资源
最近更新 更多