
A db seeder compared to raw sql
Usually I find it hard for me to compose raw sql than to write queries using ORM. Here’s a case I did recently.
<?php
use App\Company;
use App\CompanyTerritory;
use App\RegionPostcode;
use Illuminate\Database\Seeder;
class FrNomTerritoriesSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$frs = Company::where('type', 'frs')->get();
foreach($frs as $fr)
{
$fr_region_ids = $fr->regions->pluck('id')->all();
$fr_postcodes = RegionPostcode::query()->whereIn('region_id', $fr_region_ids)->get()->pluck('postcode')->all();
foreach($fr_postcodes as $pc)
{
CompanyTerritory::firstOrCreate([
'company_id' => $fr->id,
'territory_type' => CompanyTerritory::TYPE_NOM,
'postcode' => $pc
]);
}
}
}
}
INSERT INTO company_territories (company_id, territory_type, postcode) select companies.id, 'nom', rp.postcode from companies left join company_regions cr on companies.id = cr.company_id left join regions r on cr.region_id = r.id left join region_postcodes rp on r.id = rp.region_id where companies.type='frs';
In my opinion sometimes there’s no good or bad but a preferred way of doing certain things as we can achieve the same result. Though raw sql has better performance in this case as it has much less times of DB query.