with metodo many funcion attach associate php laravel pivot eloquent sync

php - metodo - sync laravel



Laravel, sync(): ¿cómo sincronizar una matriz y también pasar campos dinámicos adicionales? (5)

Adjuntar / Separar

Eloquent también proporciona algunos métodos auxiliares adicionales para hacer que trabajar con modelos relacionados sea más conveniente. Por ejemplo, imaginemos que un usuario puede tener muchos roles y un rol puede tener muchos usuarios. Para adjuntar un rol a un usuario insertando un registro en la tabla intermedia que une los modelos, use el método de conexión:

$user = App/User::find(1); $user->roles()->attach($roleId);

Al adjuntar una relación a un modelo, también puede pasar una matriz de datos adicionales para insertar en la tabla intermedia:

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

También puede usar Sincronizar si desea eliminar roles antiguos y solo conservar los nuevos que está adjuntando ahora

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

El comportamiento predeterminado se puede cambiar pasando un ''falso'' como segundo argumento. Esto adjuntará los roles con ids 1,2,3 sin afectar los roles existentes.

En este modo, la sincronización se comporta de manera similar al método de conexión.

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

Referencia: https://laravel.com/docs/5.4/eloquent-relationships

La documentación oficial de Laravel tiene esto en la función sync() :

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

También puede asociar otros valores de tabla dinámica con los ID dados:

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

En el último ejemplo, solo se agrega una única fila de pivote. Lo que no entiendo es cómo puedo asociar otros registros de tabla dinámica si hay más de una fila para sincronizar.

Gracias por adelantado.


Agregue el siguiente rasgo a su proyecto y añádalo a su clase de modelo como un rasgo. Esto es útil, porque agrega funcionalidad para usar múltiples pivotes. Probablemente alguien pueda limpiar esto un poco y mejorarlo;)

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

Modelo:

namespace App; use Illuminate/Database/Eloquent/Model; class Example extends Model { use Traits/AppTraits; // ... }

Uso:

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


Esto funciona para mi

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


Para sync varios modelos junto con datos dinámicos personalizados, necesita esto:

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

Es decir.

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

editar

Respondiendo el comentario:

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


Simplemente agregue sus campos y sus valores a los elementos:

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