У меня есть две модели, Position
а также User
, У них есть One to many
отношения между ними.
Когда я удаляю позицию, я хочу, чтобы все связанные пользователи были отсоединены от этой позиции и прикреплены к другой (найденной по id).
Я уверен, что это достаточно просто, но я попытался сделать это в foreach
кругом, без успеха:
public function postDelete($position)
{
$positionMembers = $position->users()->get();
foreach ($positionMembers as $member) {
$member->position_id = '4';
// fixed copy/paste var name error
$member->save()
}
// Was the position deleted?
if($position->delete()) {
// Redirect to the position management page
return Redirect::to('admin/positions')->with('success', Lang::get('admin/positions/messages.delete.success'));
}
// There was a problem deleting the position
return Redirect::to('admin/positions')->with('error', Lang::get('admin/positions/messages.delete.error'));
}
Я также попробовал:
$member->position()->associate($this->position->find(4));
но это тоже не работает. Поле position_id всегда остается неизменным. Есть ли более рекомендуемый способ?
Сначала определите безуспешно, потому что он ничего не говорит, и код, который вы показываете, должен работать.
Во всяком случае, я бы предложил другой подход, для использования Eloquent save
в цикле не лучший способ:
public function postDelete($position)
{
DB::transaction(function () use ($position, &$deleted) {
// run single query for update
$position->users()->update(['position_id' => 4]);
// run another query for delete
$deleted = $position->delete();
});
// Was the position deleted?
if($deleted) {
// Redirect to the position management page
return Redirect::to('admin/positions')->with('success', Lang::get('admin/positions/messages.delete.success'));
}
// There was a problem deleting the position
return Redirect::to('admin/positions')->with('error', Lang::get('admin/positions/messages.delete.error'));
}
С этим вы убедитесь, users
не обновляться, если при удалении произошла ошибка (исключение) position
и вы выполняете 2 запроса, независимо от того, сколько users
Есть, чтобы обновить.
Других решений пока нет …