ThinkPHP一对多关联中新增数据的几种方式

发布时间:2022-12-08浏览次数:998 次
在一对多关联中,分步新增较为常见,如先创建用户,再由用户上传相册。而在一对一关联中,同步新增较多,如文章标题和文章详情基本是一块进行发布的,很少会有CMS让用户

在《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()方法,不能实现一次新增多条关联数据的需求。

扫一扫,在手机上查看