我试图用一个名为data的额外字段在数据透视表中保存数据.
当我保存我有这个数组:
[
5 => "files"
4 => "pictures"
3 => "tags"
1 => "thumbs"
]
Run Code Online (Sandbox Code Playgroud)
我的表看起来像这样:
上面显示的ID指的是option_id和要在数据库中命名的字符串.
当我尝试使用这样的同步:$ project-> options() - > sync($ data);
$ data是上面显示的数组
我得到一个错误,它试图用"文件"保存option_id.
以下是我如何构建用于同步的数据:
我试图得到你的建议,但不知道如何实现它:
这是我如何构建数组:
foreach($request->input('option_id') as $id) {
$option['option_id'][] = $id;
$option['data'][] = $request->input('data')[$id];
}
$data = array_combine($option['option_id'], $option['data']);
Run Code Online (Sandbox Code Playgroud)
Jef*_*ert 13
这包含在手册中:
同步时添加数据透视数据
您还可以将其他数据透视表值与给定ID相关联:
Run Code Online (Sandbox Code Playgroud)$user->roles()->sync(array(1 => array('expires' => true)));
在你的例子中,你必须改变你的数组看起来像下面,但我相信这将转化为:
$data = [
5 => [ 'name' => "files" ],
4 => [ 'name' => "pictures" ],
3 => [ 'name' => "tags" ],
1 => [ 'name' => "thumbs" ],
];
$project->options()->sync($data);
Run Code Online (Sandbox Code Playgroud)
我相信您可能还需要修改Project模型与Options模型的关系:
// File: app/model/Project.php
public function options()
{
return $this->belongsToMany('Option')->withPivot('name');
}
Run Code Online (Sandbox Code Playgroud)
这也在链接到手册页中注明:
默认情况下,只有键将出现在数据透视对象上.如果数据透视表包含额外属性,则必须在定义关系时指定它们.
更新
尝试$data像这样创建数组:
$data = [];
foreach($request->input('option_id') as $id) {
$data[$id] = [ 'name' => $request->input('data')[$id] ];
}
Run Code Online (Sandbox Code Playgroud)