Подтвердить что ты не робот

Laravel, sync() - как синхронизировать массив, а также передавать дополнительные поля поворота?

Официальная документация Laravel имеет это в функции sync():

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

Вы также можете связать другие значения сводной таблицы с указанными идентификаторами:

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

В последнем примере добавляется только одна сводная строка. Я не понимаю, как я могу связать другие записи сводной таблицы, если есть несколько строк для синхронизации?

Спасибо заранее.

4b9b3361

Ответ 1

Для sync нескольких моделей вместе с настраиваемыми сводными данными вам понадобится следующее:

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

Т.е.

sync( array( 
    related_id => array( '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);

Ответ 2

Это работает для меня

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

Ответ 3

Присоединение/отсоединение

Eloquent также предоставляет несколько дополнительных вспомогательных методов, чтобы сделать работу с соответствующими моделями более удобной. Например, представьте себе, что пользователь может иметь много ролей, а роль может иметь много пользователей. Чтобы прикрепить роль к пользователю, вставив запись в промежуточную таблицу, которая присоединяется к моделям, используйте метод attach:

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

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

При присоединении отношения к модели вы также можете передать массив дополнительных данных, которые необходимо вставить в промежуточную таблицу:

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

Вы также можете использовать Sync, если хотите удалить старые роли и сохранить новые, которые вы сейчас прикрепляете

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

Поведение по умолчанию может быть изменено путем передачи "false" в качестве второго     аргумент. Это добавит роли с идентификаторами 1,2,3, не затрагивая существующие   роли.

В этом режиме синхронизация ведет себя аналогично методу attach.

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

Ссылка: https://laravel.com/docs/5.4/eloquent-relationships

Ответ 4

Добавьте следующую черту в свой проект и добавьте ее в свой класс модели как черту. Это полезно, потому что это добавляет функциональность для использования нескольких опорных точек. Возможно, кто-то может немного это исправить и улучшить;)

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

Ответ 5

Просто добавьте свои поля и их значения к элементам:

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