DBIx :: Class按ID从另一个表中获取行

时间:2014-06-09 09:44:47

标签: perl 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获得一个Track。

查询示例: SELECT * FROM Tracks WHERE track_id = $x

2 个答案:

答案 0 :(得分:6)

如果要生成您提供给我们的SQL,那么您拥有艺术家对象的事实就无关紧要了。只需获取跟踪结果集并在其上运行find()

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

如果出于某种原因,您没有架构对象,那么您可以从您的艺术家对象中获取该对象。

my $schema = $artist->result_source->schema;

答案 1 :(得分:1)

我认为该曲目位于您$artist的相册中。查询可以通过三个表的连接来完成。请参阅DBIx::Class::Manual::Joining

这是一个未经测试的例子。

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

如果你的曲目不一定是$ artist,那么直接查询tracks更有意义。