Laravel Eloquent Получение детей детей через модельные отношения - PullRequest
1 голос
/ 09 апреля 2020

Я пытаюсь напрямую отредактировать мою базу данных Kodi MySQL и создать инструмент для исправления некоторых ошибок, которые всегда были не совсем правильными.

отношение таблиц - tvshow -> episode -> file

Так что я могу пока (после создания моделей для этих таблиц)

  1. Список всех шоу

  2. просмотреть специфику c показать и перечислить все эпизоды

  3. показать запись файла для этого эпизода.

То, что я пытаюсь сделать, это список все файлы, которые принадлежат шоу, через выпадающий список. (поскольку мне нужно их изменить)

Поэтому мне нужно использовать модель TVShow, чтобы получить все эпиодо, имеющие запись idShow ... И затем получить все файлы на основе таблицы эпизодов. Я знаю, что Eloquent может справиться с этим обычно, но я когда-либо использовал только свою собственную структуру таблиц, но не такую, как эта ... поэтому я думаю, что моя проблема в том, чтобы использовать имена ключей и т. Д. c ...

имена столбцов ключей:

idShow

idEpisode

idFile

(где это ЖЕ имя используется в качестве первичного ключа в родительской таблице И ID сопоставления в дочерней таблице)

Anyhoo, вот мои модели ..

Есть идеи?

TVShow


<?php

namespace App\Models;

use Eloquent as Model;

class TvShow extends Model
{

    public $table = 'tvshow';
    protected $primaryKey = 'idShow';

    public function episodes()
    {
        return $this->hasMany(Episode::class, 'idShow');
    }

}

Эпизод


<?php

namespace App\Models;

use Eloquent as Model;

class Episode extends Model
{

    public $table = 'episode';
    protected $primaryKey = 'idEpisode';

    public function tvshow()
    {
        return $this->belongsTo(TvShow::class, 'idShow', 'idShow');
    }

    public function season()
    {
        return $this->hasOne(Season::class, 'idShow', 'idShow')->where('season', '>=', 0)->where('idSeason', $this->idSeason);
    }

    public function file()
    {
        return $this->hasOne(File::class, 'idFile', 'idFile');
    }

    public function files()
    {
        return $this->hasMany(File::class, 'idFile', 'idShow');
    }

}

Файл


<?php

namespace App\Models;

use Eloquent as Model;

class File extends Model
{

    public $table = 'files';
    protected $primaryKey = 'idFile';

    public function episode()
    {
        return $this->belongsTo(Episode::class, 'idFile', 'idFile');
    }

}

Я вызываю это в моем контроллере ...

TvShow::with('episodes.files')->get();

Я получаю ВСЕ шоу в виде списка ..?

1 Ответ

1 голос
/ 09 апреля 2020

Отношения hasManyThrough будут работать. Добавьте это к вашей TvShow модели.

public function files()
{
    return $this->hasManyThrough(Episode::class, File::class);
}

См. https://laravel.com/docs/7.x/eloquent-relationships#has - сквозное

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...