DBIx::Class Получить строку из другой таблицы по идентификатору

В моем проекте у меня есть 3 таблицы: Исполнители, Альбомы и Треки.

Исполнитель результатов:

...
__PACKAGE__->has_many(
     'albums' => 'MYLIB::DB::Schema::Result::MyDir::Album',
     { 'foreign.artist_id' => 'self.id', },
);
...

Альбом результатов:

...
__PACKAGE__->belongs_to(
     'artist' => 'MYLIB::DB::Schema::Result::Artist',
     { 'foreign.id' => 'self.artist_id', },
  );

__PACKAGE__->has_many(
     'tracks' => 'MYLIB::DB::Schema::Result::MyDir::Track',
     { 'foreign.album_id' => 'self.id', },
 );
...

Отслеживание результатов:

__PACKAGE__->belongs_to(
    'album' => 'MYLIB::DB::Schema::Result::MyDir::Album',
    { 'foreign.id' => 'self.album_id', },
);

Теперь у меня есть объект $artist и я хочу получить Трек по ID.

Пример запроса: SELECT * FROM Tracks WHERE track_id = $x


person extmkv    schedule 09.06.2014    source источник


Ответы (2)


Если вы хотите сгенерировать SQL, который вы нам даете, то тот факт, что у вас есть объект исполнителя, не имеет значения. Просто получите набор результатов трека и запустите find() на нем.

my $track_rs = $schema->resultset('Track');
my $track = $track_rs->find($track_id);

Если по какой-то причине у вас нет объекта схемы, вы можете получить его из объекта исполнителя.

my $schema = $artist->result_source->schema;
person Dave Cross    schedule 09.06.2014

Я предполагаю, что этот трек входит в альбом вашего $artist. Запрос может быть выполнен путем объединения трех таблиц. См. раздел DBIx::Class::Manual::Joining. .

Вот непроверенный пример.

my $tracks = $artist->search_related(
    { 
        id => $my_track_id,
    },
    { 
        join => { albums => 'tracks' },
    }
);

Если ваш трек не обязательно написан $artist, то, возможно, имеет смысл запросить tracksdirectly.

person BarneySchmale    schedule 09.06.2014