Дать идентификатор категории для подкатегории в семени laravel

Я пытаюсь добавить данные с seed в laravel 5.4, скажем, у меня есть 10 категорий, и я добавил их по seed в свою базу данных. Теперь у меня есть еще один seed для подкатегорий, но прежде чем добавить свои подкатегории, я хочу сказать, какая из них принадлежит к какой категория, которую я импортировал раньше. как бы я это сделал?

Обновить:

Я обнаружил, что мой вопрос может сбить с толку некоторых людей, поэтому я пытаюсь объяснить немного больше,

это мое category семена.

<?php

use Illuminate\Database\Seeder;

class CategoriessTableSeeder extends Seeder {

    public function run()
    {
        DB::table('categories')->delete();

        $categories = array(
            array('name' => 'Accounting/Finance', 'slug' => 'hccounting_finance'),
            array('name' => 'Admin/Human Resources', 'slug' => 'admin_human_resources'),
            array('name' => 'Arts/Media/Communications', 'slug' => 'arts_media_communications'),
            array('name' => 'Building/Construction', 'slug' => 'building_construction'),
            array('name' => 'Computer/Information Technology', 'slug' => 'computer_information_technology'),
            array('name' => 'Education/Training', 'slug' => 'education_training'),
            array('name' => 'Engineering', 'slug' => 'engineering'),
            array('name' => 'Healthcare', 'slug' => 'healthcare'),
            array('name' => 'Hotel/Restaurant', 'slug' => 'hotel_restaurant'),
            array('name' => 'Manufacturing', 'slug' => 'manufacturing'),
            array('name' => 'Sales/Marketing', 'slug' => 'sales_marketing'),
            array('name' => 'Sciences', 'slug' => 'sciences'),
            array('name' => 'Services', 'slug' => 'services'),
            array('name' => 'Others', 'slug' => 'others'),
        );

        DB::table('categories')->insert($categories);
    }
}

У меня есть другое подобное с этим для подкатегорий здесь это:

<?php

use Illuminate\Database\Seeder;

class SubategoriessTableSeeder extends Seeder {

    public function run()
    {
        DB::table('subcategories')->delete();

        $subcategories = array(
            array('name' => 'Audit & Taxation Jobs', 'slug' => 'audit_taxation_jobs', 'category_id' => ''),
        );

        DB::table('subcategories')->insert($subcategories);
    }
}

в этом образце 'category_id' => '' должен получить идентификатор / имя 'Accounting/Finance категория в category seed,

теперь мой вопрос как?

ОБНОВЛЕНИЕ 2:

Ошибка-х

[Illuminate\Database\QueryException] SQLSTATE[23000]: нарушение ограничения целостности: 1451 Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполняется (jobid,ads, ОГРАНИЧЕНИЕ ads_subcateg ory_id_foreign ИНОСТРАННЫЙ КЛЮЧ (subcategory_id) РЕКОМЕНДАЦИИ subcategories (id)) (SQL: удалить из subcategories)

 [PDOException]
  SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails

(jobid,ads, ОГРАНИЧЕНИЕ ads_subcateg ory_id_foreign ИНОСТРАННЫЙ КЛЮЧ (subcategory_id) РЕКОМЕНДАЦИИ subcategories (id))

Используемый код:

<?php

use Illuminate\Database\Seeder;
use Carbon\Carbon;

class SubcategoriesTableSeeder extends Seeder {

    public function run()
    {
        DB::table('subcategories')->delete();


            $categoryFinance = Category::select("id")->whereSlug("hccounting_finance")->firstOrFail();
            $subcategories = array(
             array('name' => 'Audit & Taxation Jobs', 'category_id' => $categoryFinance,  'slug' => 'audit_taxation_jobs', 'created_at' => Carbon::now()->format('Y-m-d H:i:s'), 'updated_at' => Carbon::now()->format('Y-m-d H:i:s')),
             array('name' => 'Banking/Financial Jobs', 'category_id' => $categoryFinance, 'slug' => 'banking-financial_jobs', 'created_at' => Carbon::now()->format('Y-m-d H:i:s'), 'updated_at' => Carbon::now()->format('Y-m-d H:i:s')),
             array('name' => 'Corporate Finance/Investment Jobs', 'category_id' => $categoryFinance, 'slug' => 'corporate_finance_investment_jobs', 'created_at' => Carbon::now()->format('Y-m-d H:i:s'), 'updated_at' => Carbon::now()->format('Y-m-d H:i:s')),
             array('name' => 'General/Cost Accounting Jobs', 'category_id' => $categoryFinance, 'slug' => 'general_cost_accounting_jobs', 'created_at' => Carbon::now()->format('Y-m-d H:i:s'), 'updated_at' => Carbon::now()->format('Y-m-d H:i:s')),
         );

         $categoryAdmin = Category::select("id")->whereSlug("admin_human_resources")->firstOrFail();
         $subcategories = array(
            array('name' => 'testing', 'slug' => 'tesingsubs', 'category_id' => $categoryAdmin, 'created_at' => Carbon::now()->format('Y-m-d H:i:s'), 'updated_at' => Carbon::now()->format('Y-m-d H:i:s')),
        );

        DB::table('subcategories')->insert($subcategories);
    }
}

1 ответ

Чтобы связать свои категории с подкатегориями, вы должны следовать логике (в зависимости от ваших отношений - N-1 NN) в документации ( https://laravel.com/docs/5.4/eloquent-relationships). Кажется, вам нужен метод attach().

Таким образом, после создания записи категории, если вы следовали соглашению схемы, вы можете применять логику для всех видов или отношений, даже для полиморфных.

Редактировать:

После редактирования кажется, что вам нужен способ снова получить доступ к записям вашей таблицы, чтобы связать их.

Так что вы можете:

$categoryFinance = Category::select("id")->whereSlug("hccounting_finance")->firstOrFail();

в вашей функции subategoriessTableSeeder run() перед созданием массива.

А затем укажите этот идентификатор в вашем subcategory_id. То же самое будет для всех категорий, которые вам нужно отнести.

Редактировать 2

Пожалуйста, проверьте еще раз, что ваши внешние ключи верны. В этом случае вы не можете удалить таблицу подкатегорий, потому что категории "нужно" subid. И вот откуда происходит нарушение ограничений. Вам не нужно удалять эти таблицы.. Вам просто нужно "кормить" их.

Поэтому попробуйте удалить операторы "delete".

Редактировать 3

Я думаю, что ошибка очевидна сейчас.. В вашей базе данных нет категории с идентификатором 2. Но опять же, проверьте, правильно ли связаны ключи (это SQL, а не проблема Laravel).

Запустите миграцию, если она есть, и просеиватели снова в правильном порядке (сначала категории, а затем подкатегории - сначала зависимость, а затем зависимая вообще)

Другие вопросы по тегам