3 модели отношений в Laravel 5 - PullRequest
0 голосов
/ 04 марта 2019

У меня есть 3 модели.

  • Project {id, name}
  • Platform {id, name}
  • Версия {id, value}

Один проект может иметь несколько платформ, и каждая платформа может иметь несколько версий в рамках проекта .У меня есть следующая таблица, которая касается моделей:

enter image description here

Как вы можете видеть, Project 6 имеет версии 1 и 3 на платформе 1, а Project 8 имеетверсии 1 и 2. на одной и той же платформе.

Я хочу получить все платформы проектов и версии этих платформ в зависимости от проекта.

Например, я хотел бы сделать

App\Project::find(6)->platform()->with('version')->get();

и получите только версии с идентификаторами 1 и 3 в моей коллекции версий платформы 1 этого проекта.

Это то, что у меня есть в Project Model:

public function platform()
{
    return $this->belongsToMany('App\Platform')->withPivot('version_id')->distinct();
}

Это то, что у меня есть в модели платформы:

public function version()
{
    return $this->belongsToMany('App\Version', 'platform_project')->distinct();
}

Не могли бы вы помочь мне найти лучший способ достичь желаемого результата?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

В этом случае вам следует использовать отношение hasManyThrough .

Определение:

Отношение «имеет много сквозных» обеспечивает удобный ярлык длядоступ к отдаленным отношениям через промежуточное отношение.Например, модель Country может иметь много моделей Post через модель промежуточного пользователя.В этом примере вы можете легко собрать все сообщения в блоге для данной страны.

Попробуйте это:

Модель проекта

 public function versions()
    {
        return $this->hasManyThrough(
            'App\Version',
            'App\Platform',
        );
    }

Первый аргумент, передаваемый методу hasManyThrough, - это имя конечной модели, к которой мы хотим получить доступ, а второй аргумент - имя промежуточной модели.

Будут использоваться типичные соглашения о внешних ключах Eloquentпри выполнении запросов отношения.Если вы хотите настроить ключи отношения, вы можете передать их в качестве третьего и четвертого аргументов методу hasManyThrough.Третий аргумент - это имя внешнего ключа промежуточной модели.Четвертый аргумент - это имя внешнего ключа в окончательной модели.Пятый аргумент - это локальный ключ, а шестой аргумент - это локальный ключ промежуточной модели:

Таким образом, вы можете получить доступ ко всем версиям проекта следующим образом:

$projectVersions = Project::find($id)->versions();

foreach($projectVersions as $version)
{
  echo $version->value; // this will echo each version value from the given project
}

ТакжеЯ думаю, вам следует изменить ваши отношения на hasMany

Модель проекта

public function platforms()
{
    return $this->hasMany('App\Platform')->distinct();
}

Модель платформы


public function versions()
{
    return $this->hasMany('App\Version')->distinct();
}

public function project()
{
    return $this->belongsTo('App\Project');
}

Версия Модель

public function platform()
{
    return $this->belongsTo('App\Platform');
}
0 голосов
/ 04 марта 2019

попробуйте это:

App\Project::find(6)->with(['platform' => function($q){
     $q->with(['version']);
}])->get();

я надеюсь помочь вам

...