Laravel Красноречивый запрос с отношением - PullRequest
0 голосов
/ 04 апреля 2020

В среде Laravel (v 5.7) у меня есть две таблицы: фильмы и версии , связанные в отношении 1 ко многим, определенным в моделях следующим образом:

class Film extends Model {
    ...
    public function versions() {
        return $this->hasMany(Version::class);
    }
}
class Version extends Model {
    ...
    public function film() {
        return $this->belongsTo(Film::class);
    }
}

Я хочу выбрать случайную версию фильма и связанной с ним родительской пленки , поэтому в контроллере я делаю это:

...
use App\Film;
use App\Version;

class HomeController extends Controller {
    ...
    public function index() {
        $rndVersion = Version::inRandomOrder()->first();
        $relatedFilm = $rndVersion->film->first();

Все работает нормально, кроме тот факт, что возвращенная пленка всегда является первым из всего набора записей, а не родителем версии , ранее загруженной из БД.

Я пытался получить все вместе с:

$rndVersion = Version::inRandomOrder()->with('film')->first();

, и это работает, но упаковывает все в один объект, хранящийся в $ rndVersion, и я предпочел бы сохранить две вещи отдельно.

Итак, что я делаю не так? Что мне обычно делать, чтобы получить родительскую запись выбранного / загруженного файла?

Заранее спасибо.

1 Ответ

0 голосов
/ 06 апреля 2020

Я обнаружил проблему ...

То, как вы вызываете метод отношения, определенный в модели, меняет возвращаемый результат.

В общем, если вы вызываете:

$model->relationship() //with parenthesis

возвращается экземпляр отношения . Вы вызываете метод как метод, и, как и для классов модели Eloquent, он «служит мощным средством построения запросов» и «предоставляет мощные возможности создания цепочек и запросов» ( см. Здесь ).

В противном случае, если вы позвоните:

$model->relationship //without parenthesis

, вы получите экземпляр коллекции . Таким образом, вы вызываете метод как свойство и получаете Laravel Collection , что позволяет вам l oop в коллекции, получать свойства записи (модели) и использовать все методы класса Collection.

Итак, в моем случае написание

$rndVersione = Version::inRandomOrder()->first();
$rndFilm = $rndVersione->film()->first(); //film() WITH parenthesis

работает, я полагаю, потому что метод first () вызывается для отношения как метода, поэтому поддерживается правильность построения запроса.

...