Reputation:
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
Upvotes: 1
Views: 2213
Reputation:
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));
Upvotes: 1
Reputation: 917
You are missing the import for the DB facade in your DatabaseSeeder class.
add this:
use Illuminate\Support\Facades\DB;
Upvotes: 0