laravel 如何同步一个数组并传递额外的透视字段?

krcsximq  于 2022-12-19  发布在  其他
关注(0)|答案(9)|浏览(165)

官方Laravel文档在sync()函数上有以下内容:

$user->roles()->sync( array( 1, 2, 3 ) );

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

$user->roles()->sync( array( 1 => array( 'expires' => true ) ) );

在后一个示例中,只添加了一个透视表行,我不明白的是,如果有多个行需要同步,如何关联其他透视表记录?

63lcw9qa

63lcw9qa1#

为了sync多个模型以及自定义透视数据,您需要:

$user->roles()->sync([ 
    1 => ['expires' => true],
    2 => ['expires' => false],
    ...
]);

即。

sync([
    related_id => ['pivot_field' => value],
    ...
]);

编辑
回复评论:

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

rkue9o1l2#

这对我有用

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
jchrr9hc

jchrr9hc3#

如果要为所有同步项目设置相同的透视值,现在可以使用->syncWithPivotValues($ids, $pivotValues)方法。
文档中的示例:

$user->roles()->syncWithPivotValues([1, 2, 3], ['active' => true]);
vptzau2j

vptzau2j4#

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

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

$user->roles()->attach($roleId);

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

$user->roles()->attach($roleId, ['expires' => $expires]);

如果要移除旧角色而仅保留现在附加的新角色,也可以使用同步

$user->roles()->sync([1 => ['expires' => $expires], 2 => ['expires' => $expires]);

默认行为可以通过传递“false”作为第二个参数来更改。这将附加ID为1、2、3的角色,而不会影响现有角色。
在此模式下,同步的行为类似于附加方法。

$user->roles()->sync([1 => ['expires' => $expires], 2 => ['expires' => $expires], false);

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

fv2wmkja

fv2wmkja5#

将以下trait添加到您的项目并将其作为trait附加到您的模型类。这很有帮助,因为这添加了使用多个透视表的功能。也许有人可以稍微清理一下并改进它;)

namespace App\Traits;

trait AppTraits
{
    /**
     * Create pivot array from given values
     *
     * @param array $entities
     * @param array $pivots
     * @return array combined $pivots
     */
    public function combinePivot($entities, $pivots = [])
    {
        // Set array
        $pivotArray = [];
        // Loop through all pivot attributes
        foreach ($pivots as $pivot => $value) {
            // Combine them to pivot array
            $pivotArray += [$pivot => $value];
        }
        // Get the total of arrays we need to fill
        $total = count($entities);
        // Make filler array
        $filler = array_fill(0, $total, $pivotArray);
        // Combine and return filler pivot array with data
        return array_combine($entities, $filler);
    }
}

型号:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Example extends Model
{
    use Traits\AppTraits;
    // ...
}

用法:

// Get id's
$entities = [1, 2, 3];
// Create pivots
$pivots = [
    'price' => 634,
    'name'  => 'Example name',
];
// Combine the ids and pivots
$combination = $model->combinePivot($entities, $pivots);
// Sync the combination with the related model / pivot
$model->relation()->sync($combination);
ztyzrc3y

ztyzrc3y6#

只需您的字段及其添加到元素中:

$user->roles()->sync([
   1 => ['F1' => 'F1 Updated']
]);
b1zrtrql

b1zrtrql7#

$data = array();
foreach ($request->planes as $plan) {
 $data_plan = array($plan => array('dia' => $request->dia[$plan] ) );                
 array_push($data,$data_plan);    
}
$user->planes()->sync($data);
w51jfk4q

w51jfk4q8#

把这个放在这里,以防我以后忘记了,再谷歌一次。
在我的例子中,我希望额外列的每一行都有相同的数据
其中,$syncData是ID数组:

$syncData = array_map(fn($locationSysid) => ['other_column' => 'foo'], array_flip($syncData));

或者没有箭头

$syncData = array_map(function($locationSysid) {
      return ['ENTITY' => 'dbo.Cli_Core'];
   }, array_flip($syncData));

(array_flip表示我们使用ID作为数组的索引)

1tuwyuhd

1tuwyuhd9#

foreach ($request->exercise_id as $key => $exercise_id) {
        $data_plan[$exercise_id] = [
            'serie' => $request->serie[$key],
            'observation' => $request->observation[$key],
        ];
    }

相关问题