РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
198 of 1392 menu

Метод toggle

Метод toggle применяется к связи типа belongsToMany и принимает в качестве параметра идентификатор или массив идентификаторов связанных записей. Метод автоматически определяет, какие связи уже существуют в промежуточной таблице, и выполняет два действия: добавляет отсутствующие связи и удаляет существующие. Возвращает массив с ключами 'attached', 'detached' и 'updated', содержащими количество затронутых записей.

Синтаксис

<?php $model->relation()->toggle($id); $model->relation()->toggle([$id1, $id2, $id3]); ?>

Приступим к использованию toggle. В наших примерах будем использовать модель User и модель Role со связью многие-ко-многим через промежуточную таблицу 'role_user'.

<?php namespace AppModels; use IlluminateDatabaseEloquentFactoriesHasFactory; use IlluminateDatabaseEloquentModel; class User extends Model { use HasFactory; public function roles() { return $this->belongsToMany(Role::class, 'role_user'); } } ?>

Пример

Давайте переключим у пользователя с id равным 1 роль с id равным 2:

<?php namespace AppHttpControllers; use AppModelsUser; use IlluminateHttpRequest; class UserController extends Controller { public function toggleRole() { $user = User::find(1); $res = $user->roles()->toggle(2); print_r($res); } } ?>

Результат выполнения кода:

[ 'attached' => [], 'detached' => [2], 'updated' => [] ]

Если роль не была привязана, то вместо 'detached' будет заполнен ключ 'attached'. Метод всегда переключает состояние связи.

Пример

Давайте переключим у пользователя с id равным 1 несколько ролей сразу:

<?php namespace AppHttpControllers; use AppModelsUser; use IlluminateHttpRequest; class UserController extends Controller { public function toggleRoles() { $user = User::find(1); $res = $user->roles()->toggle([1, 2, 3]); print_r($res); } } ?>

Результат выполнения кода:

[ 'attached' => [1, 3], 'detached' => [2], 'updated' => [] ]

В результате роль с идентификатором 1 и 3 были добавлены, а роль 2 была удалена из связи.

Пример

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

<?php namespace AppHttpControllers; use AppModelsUser; use IlluminateHttpRequest; class UserController extends Controller { public function toggleRoleWithData() { $user = User::find(1); $res = $user->roles()->toggle([ 2 => ['created_by' => 'admin'], 3 => ['created_by' => 'system'] ]); print_r($res); } } ?>

Результат выполнения кода:

[ 'attached' => [3], 'detached' => [2], 'updated' => [] ]

При добавлении новой связи метод также сохранит переданные дополнительные данные в промежуточной таблице.

Смотрите также

  • метод attach,
    который добавляет связь в промежуточную таблицу
  • метод detach,
    который удаляет связь из промежуточной таблицы
  • метод sync,
    который синхронизирует связи с заданным массивом
  • метод syncWithoutDetaching,
    который добавляет связи без удаления существующих
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить