7

歴史的な理由から、別のテーブルの ID に対応するテキスト フィールドに整数値を持つ作業中のテーブルがあります。例:

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

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

したがって、「もの」には 1 つの「他のもの」がありますが、適切に設定されるのではなく、join フィールドは varchar であり、「thingy」と呼ばれます。

Postgres では、次のようにして 2 つのテーブルを結合できます。

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

DBIx::Class でこの関係をどのように表すことができますか? これが私が試したことの1つの例です:

package MySchema::Thing;

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

3 に答える 3

3

リテラル 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 に答える