与laravel 4中的数据透视表存储关系
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了与laravel 4中的数据透视表存储关系相关的知识,希望对你有一定的参考价值。
让我解释一下我试图实现的目标。假设我有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()
我希望有人可以帮助我解决这个问题。
提前致谢。
那你几乎就在那里。你是对的,两个模型,Car
和Type
是many 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之间的区别
请试用此代码,如果有问题请告诉我们。
以上是关于与laravel 4中的数据透视表存储关系的主要内容,如果未能解决你的问题,请参考以下文章