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