Laravel:与阵列的额外场同步

kaz*_*aya 3 php sync laravel

我试图用一个名为data的额外字段在数据透视表中保存数据.

当我保存我有这个数组:

 [
     5 => "files"
     4 => "pictures"
     3 => "tags"
     1 => "thumbs"
 ]
Run Code Online (Sandbox Code Playgroud)

我的表看起来像这样:

  • PROJECT_ID
  • option_id
  • 名称

上面显示的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相关联:

$user->roles()->sync(array(1 => array('expires' => true)));
Run Code Online (Sandbox Code Playgroud)

在你的例子中,你必须改变你的数组看起来像下面,但我相信这将转化为:

$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)