【问题标题】:DBIx::Class Get row from another table by IDDBIx::Class 通过 ID 从另一个表中获取行
【发布时间】:2014-06-10 03:13:07
【问题描述】:

在我的项目中,我有 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

【问题讨论】:

    标签: perl dbix-class


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      我假设这首歌在您的$artist 的专辑中。查询可以通过三个表的连接来完成。见DBIx::Class::Manual::Joining

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

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

      如果您的曲目不一定由 $artist 制作,那么直接查询 tracks 可能更有意义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-21
        • 2018-05-23
        • 1970-01-01
        • 2020-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多