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.

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

报告相同问题?

悬赏问题

  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来