私のプロジェクトには、多対多のポリモーフィックな関係があります (Package (morphedByMany) と呼ばれるモデルの多くのインスタンスには、多くの異なるコンテンツ タイプ (各 MorphedToMany) を含めることができます)。
アクセスしてクエリを実行する必要があるいくつかの追加フィールドを含むピボット テーブルを作成したので、MorphPivot を拡張してピボット モデルを作成するのが最善であると判断しました。
クエリは簡単になりましたが、リレーションを介してコンテンツにアクセスすることはできません (App\Packages::findOrFail(1)->contentType() をクエリするとアクセスできます)。ピボットが contentType に属することを宣言する必要があることはわかっていますが、モーフィングされた 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');
});
}