Моя цель - заполнить мою базу данных на основе файлов CSV, которые меняются каждые 24 часа. Насколько я понимаю, сидеры идеально подходят для этого и даже могут быть вызваны программно по мере необходимости. Я собрал базовый код и использовал документацию с их веб-сайта, однако он не работает, и даже при включенной отладке сообщение об ошибке имеет очень мало смысла.

Я уже проверил и подтвердил, что соединение с БД работает, также закомментировал весь код Seeder, кроме строки «Truncate», и, к сожалению, это даже не похоже на обработку. Если я усекаю из маршрута, он работает, а из сеялки 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
1
user470760 21 Окт 2015 в 11:40

2 ответа

Лучший ответ

Это было вызвано тем, что сидеры Laravel не могли работать в производственной среде, что приводило к тайм-ауту. Чтобы решить эту проблему, параметр force можно передать как true, и он будет завершен, как ожидалось.

Artisan::call('db:seed', array('--class' => 'DatabaseSeeder', '--force' => true));
0
user470760user470760 21 Окт 2015 в 10:23

Вам не хватает импорта для фасада БД в вашем классе DatabaseSeeder.

Добавь это:

use Illuminate\Support\Facades\DB;
0
ShaunUK 21 Окт 2015 в 09:47