Laravel: Как определить принадлежность в MorphPivot? - PullRequest
0 голосов
/ 21 января 2019

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

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

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

EDIT Кодовые блоки по запросу

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