Laravel: Как определить принадлежность в MorphPivot?

В моем проекте есть полиморфное отношение "многие ко многим" (многие экземпляры модели Package (morphedByMany) могут содержать много разных типов контента (каждый MorphedToMany).

Я создал сводную таблицу, содержащую некоторые дополнительные поля, по которым мне нужно будет получить доступ и выполнить запрос, и поэтому я решил, что лучше всего будет создать модель Pivot путем расширения MorphPivot.

Запросы теперь достаточно просты, однако я не могу получить доступ к контенту через отношение (что я могу сделать, если я сделаю запрос к App\Packages::findOrFail(1)->contentType()). Я знаю, что должен объявить, что сводная таблица принадлежит типу contentType, но я не уверен, как это сделать, поскольку он может принадлежать любому из измененных типов контента.

Редактировать кодовыеблоки по запросу

Content1

class Song extends Model
{

  public function packages()
  {
      return $this->morphToMany('App\Package', 'packageable')->withPivot('choice')->using('App\PackageContent');
  }

Content2

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');
  }

MorphPivot

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');
      });
    }

1 ответ

Я знаю, что прошло пару лет, но, возможно, кто-то здесь натыкается. У меня была такая же проблема, и я решил ее так:

      class PackageContent extends MorphPivot
{
  protected $table = 'packageables';

  public function package()
  {
    // regular belongs to
    return $this->belongsTo(Package::class); 
  }

  public function packageable()
  {
    // one to one morph, can also be named different
    return $this->morphTo(); 
  }
}
Другие вопросы по тегам