duanmingting9544 2015-10-21 08:40
浏览 21
已采纳

数据播种机不在Laravel中工作

My objective is to populate my database based on CSV files that change every 24 hours. It is my understanding that Seeders will be perfect for this and can even be called programatically as needed. I put together the basic code and used the documentation from their website, however it is failing and even with debug enabled, the error message makes very little sense.

I have already tested and confirmed the DB connection is working, also commenting out all Seeder code except the "Truncate" line and sadly that doesn't even seem to be processing. If I truncate from within the route it works, from the seeder's run() it does not.

How can I fix or at least troubleshoot this?

Route:

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

Seeder:

<?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;
    }

}

Error:

FatalErrorException in compiled.php line 2057:
Maximum execution time of 30 seconds exceeded
  • 写回答

2条回答 默认 最新

  • drcb19700 2015-10-21 10:23
    关注

    This was caused by Laravel's Seeders being unable to run in a production environment, thus causing it to timeout. To resolve this, the force parameter can be passed as true and it will complete as expected.

    Artisan::call('db:seed', array('--class' => 'DatabaseSeeder', '--force' => true));
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?