分类的种子数据


Laravel - seed Data for categories

我目前被困在以下:我试图实现一个类别系统到我的应用程序。因此,我需要大约100-200个类别与一些"父类别"。我想创建两个表:Category和Subcategory。类别表保存父类别,子类别是它们的子类别,指向父类别的主键。下面是我对category的定义:

父类:服装

子类:女鞋

子类别:男衬衫

子类:牛仔裤

父类:Handys

子类别:智能手机

子类别:PDA

子类别:智能手表

等等

我尝试的是:

 $categories = array(['name' => 'Clothing'], ['name' => 'Handy']);
        $sub_categories = array(
            'Clothing' => ['name' => ' Woman Shoes '], ['name' => 'Men''s Shirts'],
            'Handy' => ['name' => ' Smartphones '], ['name' => 'Smartwatches ']
        );

        foreach($categories as $category)
        {
            $category = Category::create($category);
        foreach ($sub_categories as $sub_category)
        {
            $active = $sub_category[$category->name];
            $active['parent_id'] = $categories->id;
            SubCategory::create($active);
        }
    }

但是我得到错误(播种时)index undefined: clothing,猜测这是因为那部分:$sub_category[$category->name];…但是我怎样才能做得更好呢?或者我怎样才能让它工作?

我也试过了(在内部foreach中):

 $subcategory = new Subcategory();
 $subcategory->name = $sub_category['name'];
 $subcategory->parent_id = $category['id'];
 $subcategory->save();

这样,就没有错误,但是每个父类别都有每个子类别,所以我不寻找子类别的父类别。

我怎样才能得到我想要的?

我已经测试过了,效果很好:

$data = [
    'Clothing' => ['Woman Shoes', 'Men''s Shirts'],
    'Handy' => ['Smartphones', 'Smartwatches ']
];
foreach ($data as $category => $subCategories)
{
    $id = Category::create(['name' => $category])->id;
    foreach ($subCategories as $subCategory) {
        SubCategory::create([
            'parent_id' => $id,
            'name' => $subCategory
        ]);
    }
}

不要忘记添加所有字段到$fillable,因为你使用create()方法。

你应该使用Laravel Relationships…

这里Category和SubCategory之间的关系是One to Many,所以你可以创建一个这样的关系。

// App'Models'Category Model
public function sub_categories() {
    return $this->hasMany('App'Models'SubCategory');
}
// App'Models'SubCategory Model
public function category() {
    return $this->belongsTo('App'Models'Category');
}
foreach($categories as $category_arr) {
    $cat = Category::create($category_arr);
    foreach($sub_categories[$category_arr['name']] as $sub_arr) {
        $sub_cat_obj_arr[] = new SubCategory($sub_arr);
    }
    $cat->sub_categories()->saveMany($sub_cat_obj_arr);
}