从一个柱子(Laravel)在枢轴表中双排

时间:2014-11-28 17:54:48

标签: php laravel laravel-4

我有一个包含类别和子类别的列表表单,以及一个用于管理它们的数据透视表。这是我的控制器:

    $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),我使用嵌套集。

1 个答案:

答案 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的所有列表,以及嵌套在此类别中的类别。