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 - 类别的种子数据的主要内容,如果未能解决你的问题,请参考以下文章