我尝试在Laravel 5.4中添加与种子的数据,假设我有10个类别,现在我将它们添加到我的数据库中,我也有另一个子类别的种子,但是在添加之前子类别我想知道哪一个属于我之前导入的类别。我该怎么做?
更新:
我发现我的问题可能会使某些人感到困惑,所以我尝试解释更多,
这是我的category
种子。
<?php
use IlluminateDatabaseSeeder;
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 IlluminateDatabaseSeeder;
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' => ''
必须在category seed
中获得'Accounting/Finance
类别的ID/名称。
现在我的问题是如何?
更新2:
错误的
[照明数据库 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 IlluminateDatabaseSeeder;
use CarbonCarbon;
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);
}
}
为了将您的类别与子类别相关联,您应该在文档中遵循逻辑(取决于您的关系-N-1 N-N((https://laravel.com/docs/5.4/雄辩关系(。看来您需要附加方法。
因此,在创建类别条目后,如果您遵循了架构公约,则可以为各种或关系应用逻辑,即使是对多态的逻辑。
编辑:
编辑后,似乎您需要一种再次访问表的条目才能将它们关联的方法。
所以,您可以:
$categoryFinance = Category::select("id")->whereSlug("hccounting_finance")->firstOrFail();
在创建数组之前,在您的subegoriestableseeder run((函数中。
,然后在您的subCategory_id中给出该ID。您需要关联的所有类别也是如此。
编辑2
请再次检查您的外键是否正确。在这种情况下,您无法删除子类别表,因为类别"需要"子ID。这就是约束违规的来源。您不需要删除这些表..您只需要"馈送种子"它们。
因此,尝试删除"删除"语句。
编辑3
我认为现在的错误现在很明显..您的数据库中没有ID的类别。但是,再次检查键是否正确关联(这是SQL,而不是Laravel问题(。
运行迁移(如果有的话(,并以正确的顺序(第一类,然后是子类别 - 首先为依赖项,然后是依赖性的迁移(