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

我有以下MySQL模式和Eloquent模型:

mysql - 新记录和多对多插入-LMLPHP

/**
 * 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'不能为null(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;

最佳答案

我认为您没有加载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) { [...] }


祝好运

关于mysql - 新记录和多对多插入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46308031/

10-11 02:00
查看更多