douzuan2814 2015-01-13 09:50
浏览 77
已采纳

Laravel,删除记录时更新所有关系

I have two models, Position and User. They have a One to many relation between them.

When I delete a position, I want all the related users to be detached from that position and attached to a different one (found by id).

I'm sure it's simple enough, but I've tried doing it in a foreach loop, without success:

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

I've also tried:

$member->position()->associate($this->position->find(4));

but it doesn't work either. The position_id field always remains unchanged. Is there a more recommended way?

  • 写回答

1条回答 默认 最新

  • doujing2017 2015-01-13 14:08
    关注

    First off define without success, because it says nothing, and the code you're showing should work.

    Anyway, I would suggest different approach, for using Eloquent save in a loop isn't the best way:

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

    With this, you make sure users don't get updated if there's some error(exception thrown) when deleting position and you execute 2 queries, no matter how many users there are to update.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 有人能看一下我宿舍管理系统的报修功能该怎么改啊?链表那里总是越界
  • ¥15 cs loadimage运行不了,easyx也下了,没有用
  • ¥15 r包runway详细安装教程
  • ¥15 Html中读取Json文件中数据并制作表格
  • ¥15 谁有RH342练习环境
  • ¥15 STM32F407 DMA中断问题
  • ¥15 uniapp连接阿里云无法发布消息和订阅
  • ¥25 麦当劳点餐系统代码纠错
  • ¥15 轮班监督委员会问题。
  • ¥20 关于变压器的具体案例分析