Общая ошибка: 1364 Поле «factory_name» не имеет значения по умолчанию - PullRequest
1 голос
/ 07 мая 2019

Я получаю, что имя производителя не имеет значения, даже если оно ссылается на столбец идентификатора в таблице производителей, которая уже создана в базе данных и находится в одной строке с именем производителя. Почему так? Вот код:

Таблица производителя

Schema::create('manufacturer', function (Blueprint $table) {
    $table->bigIncrements('id')->autoIncrement();
    $table->string('manufacturer_name');
    $table->string('name');
    $table->timestamps();
});

Самолет стол

Schema::create('planes', function (Blueprint $table) {
        $table->bigIncrements('id')->autoIncrement();
        $table->string('icao24');
        $table->bigInteger('manufacturer_name')->unsigned()->default(1);
        $table->foreign('manufacturer_name')->references('id')->on('manufacturer');
        $table->timestamps();
    });

Вставка значений:

Таблица производителя:

$file = fopen('https://opensky-network.org/datasets/metadata/aircraftDatabase.csv', 'r');

        $headersArray = [];
        $i = 0;

        $headers = fgetcsv($file);

        foreach ($headers as $key => $value) {
            array_push($headersArray, $value);
        }

        while ($i < 50) {
            $line = fgetcsv($file);

            $comb = array_combine($headersArray, $line);

            DB::table('manufacturer')->insert(array(
                'name' => $comb['manufacturername'],
                'created_at' => date('Y-m-d H:m:s'),
                'updated_at' => date('Y-m-d H:m:s')
            )); .....

Таблица самолетов:

Тот же цикл, только другая схема:

DB::table('planes')->insert(array(
                'icao24' => $comb['icao24'],
                'created_at' => date('Y-m-d H:m:s'),
                'updated_at' => date('Y-m-d H:m:s')
            ));

Я ожидаю, что инкрементные идентификаторы будут в таблице плоскостей внутри столбца factory_name, который указывает на имя производителя в таблице Manufacturer. Теперь это просто значение по умолчанию 1 во всех строках.

Вот как выглядит БД производителя:

введите описание изображения здесь

Я хочу, чтобы эти идентификаторы 2, 3, 4 ... находились внутри таблицы плоскостей как внешние ключи в столбце имени производителя, но теперь они выглядят так:

введите описание изображения здесь

Ценю помощь.

1 Ответ

0 голосов
/ 08 мая 2019

Посмотрите, поможет ли это.

$file = fopen('https://opensky-network.org/datasets/metadata/aircraftDatabase.csv', 'r');

$headersArray = [];
$i = 0;

$headers = fgetcsv($file);

foreach ($headers as $key => $value) {
   array_push($headersArray, $value);
}

while ($i < 50) {
    $line = fgetcsv($file);

    $comb = array_combine($headersArray, $line);

    // Look up manuf to see if we already inserted it.
    // Hopefully name isn't duplicated
    $manuf = DB::table('manufacturer')->where('name', $comb['manufacturername'])->first();
    // Only insert if it isn't already there
    if ( ! $manuf ) {
        $manufId = DB::table('manufacturer')->insertGetId(array(
            'name' => $comb['manufacturername'],
        ));
    } else {
        $manufId = $manuf->id;
    }

    DB::table('planes')->insert(array(
        'icao24' => $comb['icao24'],
        'manufacturer_name' => $manufId
    ));

}

Миграции и внешние ключи

Schema::create('planes', function (Blueprint $table) {
    $table->bigIncrements('id')->autoIncrement();
    $table->string('icao24');
    $table->bigInteger('manufacturer_name')->unsigned()->default(1); // (1)
    $table->foreign('manufacturer_name')->references('id')->on('manufacturer'); // (2)
    $table->timestamps();
});

Миграции только описывают, как строить таблицы в базе данных. Они не вызывают вставку данных в таблицы. Определив (1) и (2) над вами определяют столбец и описывают, как этот столбец относится к другой таблице.

При вставке данных в таблицы ваш код должен вставлять правильные значения внешнего ключа. Миграция или база данных не сделают этого за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...