无法在Laravel中的static :: saved()方法内部访问数据透视模型的id属性

时间:2019-08-19 19:23:00

标签: laravel laravel-5 eloquent pivot laravel-5.8

我无法访问数据透视模型的id属性。我有一个枢轴模型PivotModel和两个通过该枢轴模型连接的模型

ModelA类:

public function modelB()
{
    return $this->belongsToMany(ModelB::class, 'model_a_model_b', 'model_a_id', 'model_b_id')
        ->using(PivotModel::class)
        ->withPivot('id', 'prop_1', 'prop_2');
}

ModelB类:

public function modelA()
{
    return $this->belongsToMany(ModelA::class, 'model_a_model_b', 'model_b_id', 'model_a_id')
        ->using(PivotModel::class)
        ->withPivot('id', 'prop_1', 'prop_2');
}

PivotModel:

use Illuminate\Database\Eloquent\Relations\Pivot;

class PivotModel extends Pivot
{
    public $incrementing = true;

    public static function boot() {

        parent::boot();

        static::saved(function ($model) {
            dump($model->id);
            dump($model->toArray());
        });
    }
}

数据透视表迁移文件

Schema::create('model_a_model_b', function (Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('model_a_id');
    $table->unsignedInteger('model_b_id');
    $table->string('prop_1');
    $table->string('prop_2');

    $table->unique(['model_a_id', 'model_b_id'], 'model_a_id_model_b_id');

    $table->foreign('model_a_id')
        ->references('id')->on('model_a')
        ->onDelete('cascade')
        ;

    $table->foreign('model_b_id')
        ->references('id')->on('model_b')
        ->onDelete('cascade')
        ;

    $table->timestamps();
});

我认为这应该可行。 这来自Laravel 5.8的官方文档

  

自定义数据透视模型和递增ID   如果您定义了使用自定义枢纽模型的多对多关系,并且该枢纽模型具有自动递增的主键,则应确保自定义枢纽模型类定义了设置为true的递增属性。

/**
 * Indicates if the IDs are auto-incrementing.
 *
 * @var bool
 */
public $incrementing = true;

我只能访问prop_1和prop_2属性,而不能访问id属性。

id为空

dump($model->id); 

和toArray()仅显示其他道具,而不显示id

dump($model->toArray());

1 个答案:

答案 0 :(得分:2)

我找到了一个临时解决方案。如果您知道如何做得更好,请提出建议。

如前所述,可以在created()方法中访问id属性 因此您可以使用$ model-> id轻松获得它。

static::created(function ($model) {
    dump($model->id); 
});

问题出在update()方法中,其中$ model实例填充了id以外的其他属性。 请参阅Illuminate \ Database \ Eloquent \ Relations \ Concerns \ InteractsWithPivotTable内的方法updateExistingPivotUsingCustomClass

static::updated(function($model) {
    // If the model is of type Pivot we have to store it into a different variable or overwrite it. If we need dirty props we first need to store them to separate variable before overwriting the $model variable

    $dirtyProps = $model->getDirty();

    if($model instanceof Pivot) {

        $model = get_class($model)
            ::where($model->foreignKey, $model->{$model->foreignKey})
            ->where($model->relatedKey, $model->{$model->relatedKey})
            ->firstOrFail();

        // Use the model
        $model->id ...
    }
});