【发布时间】:2020-04-07 04:25:27
【问题描述】:
我有一个带有递增 id 的自定义数据透视模型。我已经设置了一个观察者,我得到了attach、updateExistingPivot 等事件。但是,传递给观察者函数的对象不包括“id”字段。
当我尝试将相关模型保存到自定义数据透视表(下面的审核模型)时,这会给我一个错误。
class Audit extends Model
{
public function auditable()
{
return $this->morphTo();
}
}
class User extends Model
{
public function accounts()
{
return $this->belongsToMany('App\Models\Account')
->withPivot('id')
->using('App\Models\AccountUser');
}
}
class Account extends Model
{
public function users()
{
return $this->belongsToMany('App\Models\User')
->withPivot('id')
->using('App\Models\AccountUser');
}
}
class AccountUser extends Pivot
{
public $incrementing = true;
public function account()
{
return $this->belongsTo('App\Models\Account');
}
public function user()
{
return $this->belongsTo('App\Models\User');
}
public function audits()
{
return $this->morphMany('App\Models\Audit', 'auditable');
}
}
如果我这样做
$user->accounts()->updateExistingPivot($acct_id, ['description' => $description]);
触发更新事件,但它不包含在id:
(
[user_id] => 18000
[account_id] => 111389
[description] => My Description
)
然后,如果我尝试将新审核保存到自定义数据透视表,我会收到错误消息,因为 SQL 语句没有 auditable_id:
public function updating(AccountUser $auditable)
{
$audit = new Audit();
...
$auditable->audits()->save($audit);
}
生成
Integrity constraint violation: 1048 Column 'auditable_id' cannot be null (SQL: insert into `audits` (`auditable_id`, `auditable_type`, `updated_at`, `created_at`) values (?, App\\Models\\AccountUser, 2020-04-02 13:24:53, 2020-04-02 13:24:53))
任何帮助将不胜感激。
【问题讨论】:
-
你的最终目标是什么?您要保存哪些数据?
-
@MikeRoss 我已经编辑了
updating函数参数以使其更加清晰。当AccountUser更新事件触发时,我创建了一个Audit,目的是将其保存到accountModelsaudits关系中。但是,Audit是许多其他模型使用的多态关系,因此它具有auditable_id字段,该字段期望id字段存在于父模型上(在本例中为 AccountUser)。 AccountUser 是 $incrementing,当我直接创建实例时确实有一个id字段,但在通过设置using属性触发事件时没有。