【问题标题】:Store relationship with pivot table in laravel 4在 laravel 4 中存储与数据透视表的关系
【发布时间】:2015-03-22 10:27:53
【问题描述】:

让我解释一下我试图实现的目标。 假设我有 20 种汽车类型,例如跑车或家用汽车等,还有 5 种汽车,例如保时捷。

当我创建汽车时,我可以选择同时检查属于该汽车的多个汽车类型,然后将其保存。

我已经做了一些功课,看起来使用数据透视表是在 laravel 中解决这个问题的方法。

我的汽车模型中有这个方法:

public function types()
{
    return $this->belongsToMany('types', 'car_types');
}

我的类型模型中的这个方法:

public function cars()
{
    return $this->belongsToMany('Car');
}

我的表格如下所示:

汽车
- 身份证
- 名称
- created_at
- updated_at

类型
- 身份证
- 名称
- created_at
- updated_at

car_types
- car_id
- type_id

我试图在我的控制器中做的是:

    $car = new Car();
    Car::create( Input::except('types') );

    foreach(Input::get('types') as $type)
    {
      $car->types()->associate($type);
      $car->save();
    } 

这给了我以下错误:
调用未定义的方法 Illuminate\Database\Query\Builder::associate()

我希望有人能帮我解决这个问题。

提前致谢。

【问题讨论】:

    标签: laravel-4 relationship pivot-table


    【解决方案1】:

    嗯,你快到了。你说得对,CarType 这两个模型在 many to many 关系中。

    在您的模型中,您的代码显示:

    return $this->belongsToMany('types', 'car_types');
    

    return $this->belongsToMany('Car');
    

    错误 #1:

    Car 模型的types() 方法中,作为第一个参数,您应该传递模型的名称,而不是表的名称。因此,您应该将其更改为:

    return $this->belongsToMany('Type', 'car_types');
    

    错误 #2

    在您的Car 模型中,您将数据透视表定义为car_types,但Type 模型中缺少数据透视表定义。从Car 模型中的types() 方法中删除, 'car_types' 并将您的数据透视表重命名为简单的car_type,或者将, 'car_types' 添加到Type 模型中的cars() 方法中。

    错误 #3

    一旦正确设置了所有模型内容,您就可以在控制器中执行以下操作:

    $car = new Car();
    $car->name = Input::get('car_name_form_field_name_attribute');
    $car->save();
    
    $types = Input::get('types');
    
    $car->types()->sync($types);
    

    错误 #4

    我不确定这是否只是复制/粘贴错误,但您的数据透视表似乎缺少主键字段。每个表都需要一个主键字段,因此您的 car_types 表应如下所示:

    car_types

    • 身份证
    • car_id
    • type_id

    您也可以使用attach() 代替sync()。更多关于这两者的区别here

    请试用此代码,如果成功,请告诉我们。

    【讨论】:

    • 谢谢!我需要改变一件事,那就是制作 Car::create( Input::except('types') ); 的变量。并使用那个来附加类型。非常感谢您帮助我!
    猜你喜欢
    • 2017-07-22
    • 2014-08-26
    • 2021-05-31
    • 1970-01-01
    • 2020-03-19
    • 2019-07-19
    • 2020-09-01
    • 2018-09-23
    • 1970-01-01
    相关资源
    最近更新 更多