Laravel:与阵列的额外场同步

时间:2015-03-06 16:55:07

标签: php laravel sync

我尝试使用名为data的额外字段在数据透视表中保存数据。

当我保存时,我有这个数组:

 [
     5 => "files"
     4 => "pictures"
     3 => "tags"
     1 => "thumbs"
 ]

我的表格如下:

  • 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']);

1 个答案:

答案 0 :(得分:11)

manual

中介绍了这一点
  

同步时添加数据透视

     

您还可以将其他数据透视表值与给定ID相关联:

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

我相信您可能还需要修改Project模型与您的Options模型的关系:

// File: app/model/Project.php
public function options()
{
    return $this->belongsToMany('Option')->withPivot('name');
}

这也在链接到手册页中注明:

  

默认情况下,只有键才会出现在数据透视对象上。如果数据透视表包含额外属性,则必须在定义关系时指定它们。

<强>更新

尝试像这样创建$data数组:

$data = [];
foreach($request->input('option_id') as $id) { 
    $data[$id] = [ 'name' => $request->input('data')[$id] ];
}