7

由于历史原因,我们有一个表在工作中,其文本字段中的整数值对应于另一个表中的 ID。例子:

CREATE TABLE things (
    id     INTEGER,
    name   VARCHAR,
    thingy VARCHAR
);

CREATE TABLE other_things (
    id     INTEGER,
    name   VARCHAR,
);

所以一个“东西”有一个“其他东西”,但不是明智地设置,连接字段是一个varchar,称为“thingy”。

所以在 Postgres 中,我可以这样做来加入两个表:

SELECT t.id, t.name, ot.name FROM things t 
  JOIN other_things ot ON CAST(t.thingy AS int) = ot.id

如何在 DBIx::Class 中表示这种关系?这是我尝试过的一件事的示例:

package MySchema::Thing;

__PACKAGE__->has_one(
    'other_thing',
    'MySchema::OtherThing',
    { 'foreign.id' => 'CAST(self.thingy AS int)' },
); 
4

3 回答 3

4

nwellnhof 很接近,但是为了将文字 SQL 转换为 SQL::Abstract,我必须像这样执行 coderef:

__PACKAGE__->has_one(
    'other_thing',
    'MySchema::OtherThing',
    sub {
        my $args = shift;
        return {
            qq{$args->{'foreign_alias'}.id} => { q{=} => \qq{CAST($args->{'self_alias'}.dept AS int)} },
        };  
    },
); 
于 2013-09-24T16:16:23.073 回答
3

使用Literal SQL应该可以解决问题:

__PACKAGE__->has_one(
    'other_thing',
    'MySchema::OtherThing',
    { 'foreign.id' => { '=', \'CAST(self.thingy AS int)' } },
);
于 2013-09-20T22:10:19.907 回答
1

我会更改字段的数据类型。

如果这是不可能的,您可以添加另一个 int 类型的字段和一个将 varchar 转换为 int 并将其存储在 int 字段中的触发器,然后用于连接以提高性能。

于 2013-10-07T08:28:29.387 回答