Laravel, sync () - jak zsynchronizować tablicę i przekazać dodatkowe pola pivot?

Oficjalna dokumentacja Laravela ma to na sync() Funkcja:

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

Możesz również powiązać inne wartości tabeli przestawnej z podanymi identyfikatorami:

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

W tym drugim przykładzie dodawany jest tylko jeden wiersz obrotu. Nie rozumiem, w jaki sposób mogę powiązać inne rekordy tabeli przestawnej, jeśli do synchronizacji ma być więcej niż jeden wiersz?

Z góry dzięki.
Author: Томица Кораћ, 2014-12-01

3 answers

W celu sync wielu modeli wraz z niestandardowymi danymi obrotowymi, potrzebujesz tego:

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

Ie.

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

Edytuj

Odpowiadając na komentarz:

$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);
 79
Author: Jarek Tkaczyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-01 15:57:00

To działa dla mnie

foreach($photos_array as $photo_name){

//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
 9
Author: The Dude,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-02 06:00:17

Dołączanie / Odłączanie

Eloquent zapewnia również kilka dodatkowych metod pomocniczych, aby wygodniej pracować z pokrewnymi modelami. Na przykład, wyobraźmy sobie, że użytkownik może mieć wiele ról, a rola może mieć wielu użytkowników. Aby dołączyć rolę do użytkownika poprzez wstawienie rekordu w tabeli pośredniej, który łączy modele, użyj metody dołączania:

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

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

Podczas dołączania relacji do modelu, można również przekazać tablicę dodatkowych danych, które mają być wstawione do pośredniego Tabela:

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

Możesz również użyć synchronizacji, jeśli chcesz usunąć stare role i zachować tylko nowe, które teraz dołączasz

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

Domyślne zachowanie można zmienić, przekazując "false" jako sekundę kłótnia. Spowoduje to dołączenie ról z ids 1,2,3 bez wpływu na istniejące role.

W tym trybie synchronizacja zachowuje się podobnie do metody attach.

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

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

 0
Author: Miguel Trevino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-24 18:15:00