新记录和多对多插入

New record and many to many insert

我在一个项目中工作,其中的用户有一个关联的费率计划。创建新用户时,必须指定有效的费率计划。

我有以下 MySQL 架构和 Eloquent 模型:

/**
 * User Eloquent model file ...
 *
 */

public function ratePlans() {
    return $this->belongsToMany(
      'App\Models\RatePlan',
      'users_rate_plans',
      'users_id', 
      'rate_plans_id'
   );
}

因此,要使用您选择的费率计划创建新用户,我会这样做:

try {
   \DB::beginTransaction();
   $model->create($data);
   $model->ratePlans()->attach($data['rate_plan'], ['active' => 1]);
   \DB::commit();
   return $model;
} catch(\Exception $e) {
   \DB::rollback();
   return false;
}

但是,我遇到了下一个异常:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'users_id' cannot be null (SQL: insert into users_rate_plans (active, rate_plans_id, users_id) values (1, 43, ))

为什么交易没有成功?我该如何完成这项任务?

更新 1

我更改了交易代码,但结果是一样的。

try {
   \DB::beginTransaction();
   $ratePlan = \App\Models\RatePlan::find($data['rate_plan']);
   $user->ratePlans()->attach($ratePlan, ['active' => 1]);
   $user->create($data);
   \DB::commit();
   return $user;
} catch(\Exception $e) {
   \DB::rollback();
   die($e->getMessage());
   return false;
}

更新 2

我又改了一次交易码,成功了:

\DB::beginTransaction();
$user = \App\Models\User::create($data);
$ratePlan = \App\Models\RatePlan::find($data['rate_plan']);
$user->ratePlans()->attach($ratePlan, ['active' => 1]);            \DB::commit();
return $user;

我认为你没有加载 rate_plans 实体。

$model->ratePlans()->attach($data['rate_plan'], ['active' => 1]);

这一行 $data['rate_plan'] 应该是你的模型 "rate_plans" 的一个实例,我假设 $model 在这种情况下代表你的 [=14= 的实体] 模特

如果结果相同,是否也尝试过没有交易的测试? 我给你一个我的代码的例子,它是相似的:

try {
        DB::beginTransaction();
        $group = Group::create($data);
        $employees = User::whereIn('reference', $references)->get();
        $group->employees()->attach($employees);
        $group->save();
        DB::commit();
} catch(Exception $e) { [...] }

祝你好运