将类别ID提供给laravel种子

时间:2017-06-06 07:29:19

标签: laravel seed

我尝试在laravel 5.4中添加种子数据,让我说我有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' => ''必须在'Accounting/Finance中获取category seed类别的ID /名称。

现在我的问题是如何?

更新2:

错误&#39; S

  

[Illuminate \ Database \ QueryException] SQLSTATE [23000]:完整性   约束违规:1451无法删除或更新父行:a   外键约束失败(jobidads,CONSTRAINT ads_subcateg ory_id_foreign FOREIGN KEY(subcategory_id)参考   subcategoriesid))(SQL:从subcategories删除)

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

jobidads,CONSTRAINT ads_subcateg ory_id_foreign外键(subcategory_id)参考subcategoriesid))

使用的代码:

<?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 个答案:

答案 0 :(得分:0)

为了将您的类别与子类别相关联,您应该遵循文档(https://laravel.com/docs/5.4/eloquent-relationships)中的逻辑(取决于您的关系 - N-1 N-N)。看来你需要attach()方法。

因此,在创建类别条目后,如果您遵循了模式约定,则可以为所有类型或关系应用逻辑,即使对于多态类型也是如此。

<强> 编辑:

编辑后,您似乎需要再次访问表格条目才能将其关联起来。

所以,你可以:

$categoryFinance = Category::select("id")->whereSlug("hccounting_finance")->firstOrFail();
在创建数组之前,在您的SubategoriessTableSeeder run()函数中

然后在您的subcategory_id中提供该ID。对于您需要关联的所有类别,情况也是如此。

编辑2

请再次检查您的外键是否正确。在这种情况下,您无法删除子类别表,因为类别“需要”subid。这就是约束违规的来源。您不需要删除这些表格。您只需要“喂它们”。

因此,请尝试删除“删除”语句。

编辑3

我认为错误现在很明显..数据库中没有ID为2的类别。但是,再次检查密钥是否正确关联(这是一个SQL而不是Laravel问题)。

使用正确的顺序(第一个类别,然后是子类别 - 首先是依赖关系,然后是一般的依赖关系)再次运行迁移(如果有)和再次播种器