我正在一个用户与费率计划相关联的项目中工作。创建新用户时,必须指定有效的费率计划。
我有以下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]:完整性约束违规:1048列 'users_id'不能为空(SQL:插入
users_rate_plans
(active
,rate_plans_id
,users_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;
答案 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) { [...] }
祝你好运