Метод 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,
который добавляет связи без удаления существующих