Дать идентификатор категории для подкатегории в семени 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).
Запустите миграцию, если она есть, и просеиватели снова в правильном порядке (сначала категории, а затем подкатегории - сначала зависимость, а затем зависимая вообще)