我有一个包含类别和子类别的列表表单,以及一个用于管理它们的数据透视表。这是我的控制器:
$create = Listing::create(array(
'title' => Input::get('title'),
'description' => Input::get('description')
));
$category = Input::get('category');
$insert_id = $create->id;
$listing = Listing::find($insert_id);
$listing->categories()->attach($category);
$listing->save();
当我发布列表时,我想在数据透视表中创建另一行,使用相同的Listing_id但具有不同的类别(子类别),并附加它:
$subcategory = Input::get('subcategory');
*系统没有数据透视表(在Listings表中有category_id和subcategory_id),我使用嵌套集。
答案 0 :(得分:0)
一些事情。以下是您的代码的改进版本:
$listing = Listing::create(array(
'title' => Input::get('title'),
'description' => Input::get('description')
));
$listing->categories()->attach(Input::get('category'), array(
'subcategory_id' => Input::get('subcategory'),
));
$listing->save()
方法
Listing::create()
已经调用了save方法。attach()
接受第二个数组参数,允许您输入有关数据透视表的更多信息(例如您的子类别ID)我建议查看有说服力的文档,了解有关相关模型的更多提示。
http://laravel.com/docs/4.2/eloquent#inserting-related-models
来自laravel docs:
"您还可以传递一组属性,这些属性应存储在数据透视表中以用于关系:"
$user->roles()->attach(1, array('expires' => $expires));
作为回应,通过查看父类别显示具有子类别的记录:
我们可以使用查询范围为我们执行此操作(注意,这是使用包etrepat / baum时)。
此范围允许您按类别过滤模型,并查看输入类别下方的所有记录。
将此功能放在Listing
型号中:
public function scopeCategory($query, $category_id = NULL){
if($category_id){
/*
* Get descendants and self category nodes
*/
$categories = $this->categories()->find($category_id)->getDescendantsAndSelf();
/*
* Perform a subquery on main query
*/
$query->where(function ($query) use ($categories) {
/*
* For each category, apply a orWhere query to the subquery
*/
foreach($categories as $category){
$query->orWhere('category_id', $category->id);
}
return $query;
});
}
}
如何使用它(例如,使用类别ID为1,您通常使用Input :: get()从用户处获取此信息):
$listings = Listings::category(1)->all();
这将返回class_id为1的所有列表,以及嵌套在此类别中的类别。