【问题标题】:Double row in pivot table from one post (Laravel)来自一个帖子的数据透视表中的双行(Laravel)
【发布时间】:2015-01-27 10:01:30
【问题描述】:

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

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

【问题讨论】:

    标签: php laravel laravel-4


    【解决方案1】:

    一些事情。这是您的代码的改进版本:

    $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)

    我建议查看 eloquent 文档以获取有关相关模型的更多提示。

    http://laravel.com/docs/4.2/eloquent#inserting-related-models

    来自 laravel 文档:

    “您还可以传递一个属性数组,这些属性应该存储在关系的数据透视表中:”

    $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();
    

    这将返回 category_id 为 1 的所有列表,以及嵌套在此类别中的类别。

    【讨论】:

    • 如果您要批量分配这些输入,那么您不妨将它们作为数组从表单中获取。 [
    • 这会让它更短,是的,但这会故意将用户的所有输入直接传递到模型中,而不是准确定义正在设置的字段和输入。用户可以即时编辑网页的 HTML 并开始尝试批量分配模型上的所有字段。绝对不喜欢那种声音。
    • 谢谢,但是当我这样做时: $listing->categories()->attach(Input::get('category'), array( 'category_id' => 输入: :get('子类别'), ));在我的数据库中,我得到 ID OK,CategoryID OK,但 ListingID 是子类别 ID,而不是创建具有子类别和相同列表 ID 的另一行
    • 不幸的是我不明白。如果你想重新创建一个嵌套的集合模式,我建议使用这个包:github.com/etrepat/baum
    • 我正在使用它,但我认为它与我想做的事情不同。每次您发布表单时,我希望它保存与您选择的类别一样多的条目,在这种情况下为两个,在数据透视表中(但具有相同的 ListingID),所以当您想要显示父母和孩子时,他们会显示列表在两者中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 2016-12-06
    相关资源
    最近更新 更多