【问题标题】:Laravel custom pivot with incrementing key observer event errorLaravel 自定义枢轴增加关键观察者事件错误
【发布时间】:2020-04-07 04:25:27
【问题描述】:

我有一个带有递增 id 的自定义数据透视模型。我已经设置了一个观察者,我得到了attachupdateExistingPivot 等事件。但是,传递给观察者函数的对象不包括“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,目的是将其保存到accountModels audits 关系中。但是,Audit 是许多其他模型使用的多态关系,因此它具有 auditable_id 字段,该字段期望 id 字段存在于父模型上(在本例中为 AccountUser)。 AccountUser 是 $incrementing,当我直接创建实例时确实有一个 id 字段,但在通过设置 using 属性触发事件时没有。

标签: laravel eloquent


【解决方案1】:

事实证明,这已在 Laravel 7.x 分支中修复,而我仍在 6.x 上。 即在 7.x 中,自定义数据透视事件将具有 id 字段(以及所有其他字段)(如果存在)。

【讨论】:

    猜你喜欢
    • 2014-12-12
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2019-10-27
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多