【问题标题】:Laravel: extra field sync with arrayLaravel:与数组同步的额外字段
【发布时间】:2015-05-08 08:20:37
【问题描述】:

我正在尝试将数据保存在带有名为 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']);

【问题讨论】:

    标签: php laravel sync


    【解决方案1】:

    这在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] ];
    } 
    

    【讨论】:

    • 我正在尝试您的建议,但不知道如何实现它:( 我已经编辑了上面的内容以及我如何构建数组
    • 更新了答案,尝试像这样构建您的 $data 数组。
    猜你喜欢
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 2017-11-22
    • 2015-12-24
    • 1970-01-01
    • 2018-08-14
    相关资源
    最近更新 更多