ThinkPHP一对多关联中新增数据的几种方式
在《ThinkPHP一对一关联表数据软删除后恢复的思路和解决方案》一文中,我们将新增数据的方式分为了同步新增和分步新增两种方式。实际上,这是我们自行定义的一个“概念”,在一对多关联中,新增数据,我们也可以按此分类:
一、分步新增
在一对多关联中,分步新增较为常见,如先创建用户,再由用户上传相册。而在一对一关联中,同步新增较多,如文章标题和文章详情基本是一块进行发布的,很少会有CMS让用户先创建文章标题,再去填充内容,至少这种设计思路在体验上很不好。
依然以用户和银行卡的场景举例,分步新增,第一步先创建了用户,再由用户去完善银行卡的信息,即在添加银行卡时,用户信息已经存在。实现代码如下:
1.1每次新增一条关联记录:
$user = User::find(3);
$res = $user->card()->save(['card_num' => 123456]);
当然,新增一条数据时,且数据未提前分类的情况下,我们也可以使用together()方法来实现同样的效果:(存在反馈,后续重新测试)
$user->data($data)->together(['card'=>['card_num']])->save();
1.2 一次新增的多条关联记录:
$user = User::find(9);
$res= $user->card()->saveAll([
['card_num'=>999999999999],
['card_num'=>999999999999]
]);
即,使用saveAll()方法+数组数据的方式进行新增。
二、同步新增
一对多关联中,同步新增的情况较少,但还是存在的,比如,在新增用户界面,就要求用户上传一张或多张相册/银行卡的场景。在一对多的模型关联时,需使用如下代码完成:
$user = new User();
$data = [
'name' => 'Alone',
'card' => [['card_num' => 123], ['card_num' => 456], ['card_num' => 789]],
];
$user->data($data)->save();
$res = $user->card()->saveAll($data['card']);
即,还是手动将数据进行分开,单独再给关联表写入数据。使用together()方法,不能实现一次新增多条关联数据的需求。