Laravel - 类别的种子数据

Posted

技术标签:

【中文标题】Laravel - 类别的种子数据【英文标题】:Laravel - seed Data for categories 【发布时间】:2017-03-20 23:10:42 【问题描述】:

我目前遇到以下问题:我正在尝试为我的应用实施分类系统。因此,我需要大约 100-200 个类别和一些“父类别”。所以我想创建两个表:Category,Subcategory。类别表保存父类别,子类别是它们的子类别,指向父类别的主键。这就是我对类别的意思:

父类:服装

子类别:女鞋

子类别:男士衬衫

子类别:牛仔裤

父类: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();

这样就没有报错了,但是每一个父类都有每一个子类,所以我就不找子类parents了。

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

【问题讨论】:

【参考方案1】:

我已经测试过了,它工作正常:

$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() 方法。

【讨论】:

好的,现在答案是什么?将最后一行更改为您提供的代码?同样的错误,未定义的索引... 我已经更新了我的代码。它会为您工作,并且更具可读性。 是的,这很好用。我现在使用 protected $guarded = ['id'];因为其他一切都应该是可批量分配的。【参考方案2】:

你应该使用 Laravel 关系...

这里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);

希望这有助于以 Laravel 方式解决您的问题

【讨论】:

在我的情况下使用它的方法是什么?只是顶部相同的定义,然后是两个函数加上foreach? [Symfony\Component\Debug\Exception\FatalThrowableError] 类型错误:传递给 Illuminate\Database\Eloquent\Relations\HasOneOrMany::save() 的参数 1 必须是 Illuminate\Database\Eloquent 的实例\Model,给定的布尔值 类型错误:传递给 Illuminate\Database\Eloquent\Model::__construct() 的参数 1 必须是数组类型,给定字符串 您所做的更改是否正确?子类别属于自身? 不是我的错,SubCategory 属于 Categpry,不错

以上是关于Laravel - 类别的种子数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4,如何为具有关系的表创建种子数据?

Laravel 4:处理种子中的关系

Laravel 迁移外键取决于种子数据

如何使用 laravel 迁移和种子正确处理数据库数据更改

播种数据库后的laravel种子回滚

如何在 Laravel 中数据库种子 JSON 字段?