我尝试在laravel 5.4中添加带有seed的数据,假设我有10个类别,我通过种子将它们添加到我的数据库中,现在我也有了另一个子类别的种子,但是在添加我的子类别之前,我想知道哪个是我之前导入的类别。我该怎么做?
更新:
我发现我的问题可能会让一些人困惑,所以我试着解释一下,
这是我的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' => ''必须在category seed中获取'Accounting/Finance类别的id/名称。
现在我的问题是怎么做?
更新2:
错误的
照明\数据库\QueryException SQLSTATE23000:完整性约束违反: 1451不能删除或更新父行:外键约束失败(
jobid.ads,约束ads_subcateg ory_id_foreign外键(subcategory_id)引用subcategories(id)) (SQL:从subcategories删除) PDOException SQLSTATE23000:完整性约束违反: 1451不能删除或更新父行:外键约束失败 (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);
}
}发布于 2017-06-06 12:22:38
为了将您的类别与子类别关联起来,您应该遵循文档(https://laravel.com/docs/5.4/eloquent-relationships)中的逻辑(取决于您的关系-N-1N-N)。似乎您需要attach()方法。
因此,在创建类别条目之后,如果您遵循了模式约定,则可以将逻辑应用于所有类型或关系,甚至是多态关系。
编辑:
编辑之后,您似乎需要一种方法再次访问表的条目,以便将它们关联起来。
所以,你可以:
$categoryFinance = Category::select("id")->whereSlug("hccounting_finance")->firstOrFail();在创建数组之前,在您的SubategoriessTableSeeder run()函数中。
然后在你的subcategory_id中给出这个id。对于你需要关联的所有类别也是如此。
编辑2
请再检查一下你的外键是否正确。在这种情况下,您不能删除子类别表,因为类别“需要”子In。这就是违反约束的原因。你不需要删除这些表。你只需要“喂”他们。
因此,尝试删除“删除”语句。
编辑3
我认为这个错误现在已经很明显了。数据库中没有id为2的类别。但是,再次检查键是否正确关联(这是一个SQL问题,而不是Laravel问题)。
运行迁移(如果有的话),并再次运行种子器,并使用正确的顺序(首先是类别,然后是子类别--首先是依赖项,然后是一般的依赖项)。
https://stackoverflow.com/questions/44383866
复制相似问题