新记录和多对多插入

时间:2017-09-19 19:04:27

标签: mysql transactions eloquent many-to-many lumen

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

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

enter image description here

/**
 * 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]:完整性约束违规:1048列   'users_id'不能为空(SQL:插入users_rate_plans   (activerate_plans_idusers_id)值(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;

1 个答案:

答案 0 :(得分:0)

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

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

在这一行中$data['rate_plan']应该是您的模型“rate_plans”的一个实例,我假设$model在这种情况下代表您的User模型的实体

如果结果是相同的,还没有尝试过没有交易的测试? 我举一个类似的代码示例:

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