与laravel 4中的数据透视表存储关系

问题描述 投票:0回答:1

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

当我创建一辆汽车时,我可以选择在属于汽车的同时检查多种汽车类型而不是保存它。

我已经完成了一些功课,看起来像使用数据透视表是这种内部laravel的方式。

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

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

而且这个方法在我的类型模型中:

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

我的表看起来像这样:

汽车 - ID - 名称 - created_at - updated_at

类型 - ID - 名称 - 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个回答
0
投票

那你几乎就在那里。你是对的,两个模型,CarTypemany to many关系。

在您的模型中,您有代码说:

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

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

Error #1:

types()模型的Car方法中,作为第一个参数,您应该传递模型的名称,而不是表的名称。所以你应该改变它:

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

Error #2

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

Error #3

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

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

$types = Input::get('types');

$car->types()->sync($types);

Error #4

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

car_types

  • ID
  • car_id
  • TYPE_ID

您也可以使用attach()而不是sync()。更多关于这两个here之间的区别

请试用此代码,如果有问题请告诉我们。

© www.soinside.com 2019 - 2024. All rights reserved.