У меня есть проект 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,
]);