Имам проект на Laravel, където бих искал да вмъкна над 900 града в база данни като зареждане на база данни.
Например мога да го направя по следния начин:
$state_id = State::whereName('state name')->pluck('id');
$city = new City();
$city->name = 'my city name';
$city->state_id = $state_id;
$city->save();
и в моя градски модел дефинирах запазване като:
public function save(array $options = array()) {
$this->url = $this->createUrl($this->name);
parent::save($options);
}
така че създава и URL адрес за града.
Мога да поставя 900 пъти такъв блок от кодове, но има един проблем - той ще се изпълнява в отделни заявки, така че ще отнеме над 30 секунди, за да вмъкнете тези данни в базата данни.
Мога да го направя например по следния начин:
DB::table('cities')->insert(
[
[
'name' => 'City name',
'url' => Slug::create('City name'),
'created_at' => $now,
'updated_at' => $now,
'state_id' => $state_id
],
[
'name' => 'City name 2',
'url' => Slug::create('City name 2'),
'created_at' => $now,
'updated_at' => $now,
'state_id' => $state_id
],
]);
и по този начин мога да вмъкна много записи в една SQL заявка, но според мен това не е много хубаво решение - трябва ръчно да настроя всички полета на базата данни, но отнема само 3-4 секунди, за да вмъкна всички данни в базата данни.
Въпросът е - възможно ли е да се създават модели и с помощта на някакъв магически метод да се връща готов PHP масив, за да се използва при вмъквания на множество файлове (прочетох, че Eloquent не може да се използва за вмъкване на множество записи в една заявка)?
Мисля, че много по-добре би било да се кодира нещо подобно:
$state_id = State::whereName('state name')->pluck('id');
$city = new City();
$city->name = 'my city name';
$city->state_id = $state_id;
$city1 = $city->saveFake(); // magic method that returns complete array
$city = new City();
$city->name = 'my city name';
$city->state_id = $state_id;
$city2 = $city->saveFake(); // magic method that returns complete array
DB::table('cities')->insert(
[
$city1,
$city2,
]);