我无法访问数据透视模型的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());
答案 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 ...
}
});