В моем приложении Laravel у меня есть связь между User
и Team
, где поле department
в таблице users
связано с полем name
в таблице teams
.
Это представлено данным отношением:
/**
* Specify that a user belongs to only one team
*
* @return void
*/
public function team()
{
return $this->belongsTo(Team::class, 'department', 'name');
}
Очевидно, что проблема с этим подходом заключается в том, что если вы измените название команды, пользователи станут сиротами.
Чтобы исправить это, я попробовал следующее:
/**
* Update this team in the database
* If the team name changes also update the associated users
*
* @param Team $team
* @return void
*/
public function update(UpdateTeam $request, Team $team)
{
$data = $request->validated();
if ($data['name'] != $team->name) {
foreach ($team->users as $user) {
$user->fill([
'department' => $data['name'],
])->save();
}
}
$team->fill($data)->save();
}
Но в модели User
у меня также есть этот аксессор:
/**
* Get a direct link to this user's profile using the global route helper
*/
public function getProfilePageAttribute()
{
return $this->department ? route('profile.show', [$this->team->slug, $this->username]) : null;
}
Когда я обновляю название команды, это выдает ошибку, потому что во время изменения $this->team
эффективно null
.
У меня есть TeamObserver
и я пытался привязать это поведение к событию updating
, но отношение $team->users
также вернуло бы null
, так как при этом использовался бы текущий атрибут, а не старый атрибут.
Есть ли способ обойти это без сопоставления названий команд с идентификаторами в таблице пользователей? Главным образом из-за того, что предоставленные данные использовали названия как отдел.
Можно ли указать отношение для использования старых атрибутов при обновлении?