在我的项目中,存在多对多的多态关系(称为 Package (morphedByMany) 的模型的许多实例可以包含许多不同的内容类型(每个 MorphedToMany)。
我创建了一个数据透视表,其中包含一些我需要访问和查询的附加字段,因此我决定最好的办法是通过扩展 MorphPivot 创建一个 Pivot 模型。
查询现在很容易,但是,我无法通过关系访问内容(如果我查询 App\Packages::findOrFail(1)->contentType(),我可以做到这一点)。我知道我应该声明枢轴属于内容类型,但我不确定如何处理它,因为它可能属于任何变形的内容类型。
根据要求编辑 代码块
内容1
class Song extends Model
{
public function packages()
{
return $this->morphToMany('App\Package', 'packageable')->withPivot('choice')->using('App\PackageContent');
}
内容2
class Video extends Model
{
public function packages()
{
return $this->morphToMany('App\Package', 'packageable')->withPivot('choice')->using('App\PackageContent');
}
包裹
class Package extends Model
{
public function songs()
{
return $this->morphedByMany('App\Song', 'packageable')->withPivot('choice')->using('App\PackageContent');
}
public function videos()
{
return $this->morphedByMany('App\Video', 'packageable')->withPivot('choice')->using('App\PackageContent');
}
变形枢轴
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\MorphPivot;
class PackageContent extends MorphPivot
{
protected $table = 'packageables';
数据透视表迁移
public function up()
{
Schema::create('packageables', function (Blueprint $table) {
$table->integer('package_id');
$table->integer('packageable_id');
$table->string('packageable_type');
$table->integer('choice');
});
}