Laravel,sync() - 如何同步数组并传递额外的数据透视字段?

Том*_*раћ 54 php pivot sync laravel eloquent

官方Laravel文档具有以下sync()功能:

$user->roles()->sync( array( 1, 2, 3 ) );
Run Code Online (Sandbox Code Playgroud)

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

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

在后一示例中,仅添加了一个枢轴行.我不明白的是,如果要同步多行,如何关联其他数据透视表记录?

提前致谢.

Jar*_*zyk 114

要将sync多个模型与自定义数据透视数据一起使用,您需要:

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

IE浏览器.

sync( array( 
    related_id => array( 'pivot_field' => value ),
    ...
));
Run Code Online (Sandbox Code Playgroud)

编辑

回答评论:

$speakers  = (array) Input::get('speakers'); // related ids
$pivotData = array_fill(0, count($speakers), ['is_speaker' => true]);
$syncData  = array_combine($speakers, $pivotData);

$user->roles()->sync($syncData);
Run Code Online (Sandbox Code Playgroud)


Rob*_*bin 25

->syncWithPivotValues($ids, $pivotValues)如果您想为所有同步项目设置相同的主值,现在可以使用一种方法。

文档中的示例:

$user->roles()->syncWithPivotValues([1, 2, 3], ['active' => true]);
Run Code Online (Sandbox Code Playgroud)


The*_*ude 14

这适合我

foreach ($photos_array as $photo) {

    //collect all inserted record IDs
    $photo_id_array[$photo->id] = ['type' => 'Offence'];  

}

//Insert into offence_photo table
$offence->photos()->sync($photo_id_array, false);//dont delete old entries = false
Run Code Online (Sandbox Code Playgroud)

  • 赞成这个,因为它漂亮又干净,我怀疑任何后续开发人员都会很容易理解和修改。 (3认同)
  • 您也可以将 ```->sync($photo_id_array, false)``` 替换为 ```->syncWithoutDetaching($photo_id_array)``` 。也赞成,因为这是最优雅的解决方案。 (3认同)

Mig*_*ino 5

安装/拆卸

Eloquent 还提供了一些额外的辅助方法,使使用相关模型更加方便。例如,假设一个用户可以有多个角色,一个角色可以有多个用户。要通过在连接模型的中间表中插入记录来将角色附加到用户,请使用 attach 方法:

$user = App\User::find(1);

$user->roles()->attach($roleId);
Run Code Online (Sandbox Code Playgroud)

将关系附加到模型时,您还可以传递要插入中间表的附加数据数组:

$user->roles()->attach($roleId, ['expires' => $expires]);
Run Code Online (Sandbox Code Playgroud)

如果您想删除旧角色并仅保留您现在附加的新角色,也可以使用同步

$user->roles()->sync([1 => ['expires' => $expires], 2 => ['expires' => $expires]);
Run Code Online (Sandbox Code Playgroud)

可以通过将“false”作为第二个参数传递来更改默认行为。这将附加 ID 为 1、2、3 的角色,而不会影响现有角色。

在这种模式下,sync 的行为类似于 attach 方法。

$user->roles()->sync([1 => ['expires' => $expires], 2 => ['expires' => $expires], false);
Run Code Online (Sandbox Code Playgroud)

参考:https : //laravel.com/docs/5.4/eloquent-relationships