在我的项目中,我有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
答案 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
更有意义。