@NewSantaClaus

Как правильно создать сидер когда имеешь связь с родителем (laravel 8)?

У меня есть данные, а именно:
- города
- населенные пункты в каждом городе
- тип населенного пункта

Мне нужно наполнить базу таким образом, чтобы населенный пункт быть привязан к конкретному городу по его id. База должна наполнятся реальными данными, а не с помощью факера.

В теории, я бы мог сделать что-то вроде:
<?php

namespace Database\Seeders;

use App\Models\Locality;
use App\Models\LocalityType;
use App\Models\RegionalCenter;
use Illuminate\Database\Seeder;

class LocalitySeeder extends Seeder
{
    public $localities = [
        [
            'name' => 'Населенный пункт 1',
            'type' => 'Название типа 1',
            'region' => 'Название обл. 1'
        ],
        [
            'name' => 'Населенный пункт 2',
            'type' => 'Название типа 2',
            'region' => 'Название обл. 2'
        ]
    ];

    public function run()
    {
        foreach($this->localities as $locality){
            Locality::insert([
                'name' => $locality['name'],
                'regional_center_id' => function() use($locality){
                    return RegionalCenter::findOrCreate(['name' => $locality['region']])->id;
                },
                'locality_type_id' => function() use($locality){
                    return LocalityType::findOrCreate(['name' => $locality['type']])->id;
                }
            ]);
        }
    }
}

Но что-то мне подсказывает что так не гуд. Как это сделать правильно?

Либо формат данных еще может быть такой, в зависимости от оптимального решения задачи
public $regional_centers = [
        [
            'name' => 'Название обл. 1',
            'localities' => [
                [
                    'name' => 'Населенный пункт 1',
                    'type' => 'Название типа 1'
                ]
            ]
        ],
        [
            'name' => 'Название обл. 2',
            'localities' => [
                [
                    'name' => 'Населенный пункт 2',
                    'type' => 'Название типа 2'
                ]
            ]
        ],
    ];
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ответы на вопрос 1
toratoda
@toratoda
все почти так. два нюанса:
1. каждый шаг в цикле делать два запроса на регион и тип это не хорошо : слишком много запросов. Решение: обойди в цикле данные выбери все уникальные значения для регионов и типов и в двух запросов получи все нужные регионы и типы (а потом оперируй этими данными).
2. делать операцию вставки на каждый шаг тоже не хорошо : слишком много запросов. Решение: сформируй массив со всеми данными для вставки и выполните запрос вставки к базе данных.

примечание: следует оценить объем данных и если он очень большой то его нужно разбить на части
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы