简体   繁体   中英

Database Seeders not working in 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

You are missing the import for the DB facade in your DatabaseSeeder class.

add this:

use Illuminate\Support\Facades\DB;

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));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM