多对多关联关系中sync()方法为什么只会更新一条记录?

举个例子

User表:

id user_name
1 John
2 Mike

Car表:

id car_name
3 BMW
4 Benz
5 Audi

中间表user_car_relation:

id user_id car_id deleted_at
6 1 3 NULL
7 1 4 NULL
8 2 5 NULL
9 1 4 NULL

注意第 9 条记录,是与第7条重复的记录

从以上简单的关联关系可以看出,John 有两部车,分别是 BMW 和 Benz。Mike 只有一部车 Audi。基于以上数据,如果 John 卖掉了一辆 Benz 车,对应到代码中:

User::find(1)->sync([
    4 => ['deleted_at' => date('Y-m-d H:i:s')],
], false);

此时user_car_relation表会变为:

id user_id car_id deleted_at
6 1 3 NULL
7 1 4 2021-06-19 12:32:39
8 2 5 NULL
9 1 4 NULL

看到没,第 9 条记录没有同步变化!

追溯到部分源码:

    protected function updateExistingPivotUsingCustomClass($id, array $attributes, $touch)
    {
        $pivot = $this->getCurrentlyAttachedPivots()
                    ->where($this->foreignPivotKey, $this->parent->{$this->parentKey})
                    ->where($this->relatedPivotKey, $this->parseId($id))
                    // 这里为什么用first()只获取一条记录?如果我的关联关系表中出现多个重复的记录,就会导致重复的其他几条记录不能更新掉数据
                    ->first();
    }

问题

框架中sync()方法只更新一条记录的用意是什么?这算BUG吗?

再见了妈妈今晚我就要远航,别为我担心我有快乐和智慧的桨~
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3
chowjiawei

快回到 快乐星球 找艾克帮你解决

2年前 评论
LiamHao (楼主) 2年前

这个不算BUG的,表设计的问题,默认多对多中user_id和car_id在一张表中只会有一条记录

2年前 评论
LiamHao (楼主) 2年前
注意第 9 条记录,是与第 7 条重复的记录

为什么会重复呢?

2年前 评论
LiamHao (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!