【问题标题】:Laravel - Pivot table for three models - how to insert related models?Laravel - 三个模型的数据透视表 - 如何插入相关模型?
【发布时间】:2014-07-02 07:36:13
【问题描述】:

我有三个具有多对多关系的模型:UserActivityProduct。 这些表看起来像idname。并且在每个模型中都有功能,例如在用户模型中:

public function activities()
{
    return $this->belongsToMany('Activity');
}
public function products()
{
    return $this->belongsToMany('Product');
}

数据透视表User_activity_product 是:

iduser_idactivity_idproduct_id。目标是获取如下数据:User->activity->products。 有可能以这种方式组织这种关系吗?以及如何更新这个数据透视表?

【问题讨论】:

    标签: laravel-4 many-to-many pivot relationships


    【解决方案1】:

    首先,我建议您将数据透视表重命名为 activity_product_user,以便它符合 Eloquent 命名约定,从而使生活更轻松(我的示例将使用该名称)。

    你需要像这样定义关系:

    // User model
    public function activities()
    {
        return $this->belongsToMany('Activity', 'activity_product_user');
    }
    public function products()
    {
        return $this->belongsToMany('Product', 'activity_product_user');
    }
    

    然后就可以获取相关模型了:

    $user->activities; // collection of Activity models
    $user->activities->find($id); // Activity model fetched from the collection
    $user->activities()->find($id); // Activity model fetched from the db
    
    $user->activities->find($id)->products; // collection of Product models related to given Activity
    // but not necessarily related in any way to the User
    
    $user->activities->find($id)->products()->wherePivot('user_id', $user->id)->get();
    // collection of Product models related to both Activity and User
    

    您可以通过设置自定义 Pivot 模型、最后一行的辅助关系等来简化处理此类关系。

    要附加最简单的方法应该是将第三个键作为参数传递,如下所示:

    $user->activities()->attach($activityIdOrModel, ['product_id' => $productId]);
    

    所以它需要一些额外的代码才能使其完美,但它是可行的。

    【讨论】:

    • 请注意,要更新数据透视表中的值,您可以在 Laravel 5 中使用同步方法而不是附加方法,在 Laravel 4 中使用 updateExistingPivot。
    【解决方案2】:

    通过一些更改找到了解决方案。 在模型中,关系如下所示:

    // User model
    public function activities()
    {
        return $this->belongsToMany('Activity', 'user_activity_product', 'user_id', 'activity_id')->withPivot('product_id');
    }
    public function products()
    {
        return $this->belongsToMany('Product', 'user_activity_product', 'user_id', 'product_id')->withPivot('activity_id');
    }
    

    更新数据透视表:

    $user->products()->save($product, array('activity_id' => $activity->id));
    

    - 我从 Input 获得的产品和活动 ID。 并且,例如,检查“用户 -> 某些活动 -> 某些产品是否已经存在”:

    if ($company->activities->find($activity_id)->products()->where('product_id', '=', $product_id)->wherePivot('company_id', $company_id)->get()->count() > 0) {
                // code...
    }
    

    我认为它需要改进,但它现在对我有用。

    【讨论】:

    • 这个论坛中还有其他几个主题在询问完全相同的事情(三向数据透视表)。我在我的应用程序中实现了这个解决方案,效果很好。这是适合我情况的理想方法。对于此示例,我用于查找公司针对特定产品的所有活动的查询如下所示... $activities = $company->activities()->where('product_id', '=', 123 )
    • 写的时候: $user->products()->save($product, array('activity_id' => $activity->id));我猜你的意思是: $user->products()->save($product_id, array('activity_id' => $activity_id)); ?
    猜你喜欢
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多