2

Kohana についてのこれらのすべての質問を申し訳ありません。通常、それらは無視されます。バグを見つけただけだと思います。直接関係のない 2 つのテーブルを結合しています。

$results = ORM::factory('foo')->join("bar")->on("foo.foreign_id", "=", "bar.id");

これにより、テーブル名を明示的に解決しないクエリが生成されます。

SELECT * FROM `foo` JOIN `bar` ON (`foo`.`foreign_id` = `bar`.`id`)

これにより、(phpMyAdmin で) 次のようなテーブルが得られます。

id    time          foreign_id      blah_int    id  baz
4     1291851245    3           0               3   52501504

テーブル用とid用の 2 つの列があることに注意してください。これは深刻な問題です。今、私の結果では、ループスルーすると...foobar

foreach ($results as $result) {
    echo $result->id;    // prints 3!!!
}

私の結果はfooオブジェクトでなければならないので、4 の ID を取得することを期待していますが、結合のために 3 になっています。これは ORM ライブラリのバグですか? クエリからの結果を制限するには、別の方法を使用する必要がありますか? barすべてのs id をロードしてfooから s をそのようにロードする 2 つの別々のクエリを実行したくはありませんが、そうしなければならないようです。

4

1 に答える 1

1

次のように、ORM ではなく生のクエリを作成するには、Database オブジェクトを使用する必要があります。

$results = DB::select()->from('foo')->join('bar')->on("foo.foreign_id", "=", "bar.id")->execute();

ただし、意図したとおりにORMを使用しない限り、クエリを機能させるには、いくつかの列エイリアスを指定する必要があります。

ORM の使用

ORM を使用する場合は、モデルで関係を定義する必要があります。あなたは、それらが別のテーブルとの関係を共有していると述べているので、あなたのケースでは、次のような関係を介して has many を使用できます。

protected $_has_many = array(
    'bars' => array('model' => 'bar', 'through' => 'other_table', 'foreign_key' => 'foreign_id'),
    );

与えられた例は、まっすぐな has_many 関係が機能することを示唆していますが:

protected $_has_many = array(
    'bars' => array('model' => 'bar','foreign_key' => 'foreign_id'),
    );

これにより、次のようなステートメントを使用してすべてのバーにアクセスできます

$bars = $results->bars->find_all();
foreach($bars as $bar)
{
    echo $bar->id; // should echo 4, assuming one record in bars with id 4
}

ORM とリレーションシップについて詳しく知りたい場合は、Kohana 3.1 ORM リファレンス ガイドから始めるとよいでしょう

Kohana データベース オブジェクトとクエリ ビルダーの使用

アドホック クエリを好み、クエリ ビルダーを使用して結合を行っている場合は、Kohana を使用しているか、単に生のクエリを使用しているかに関係なく、列名が衝突する可能性があります ("SELECT * FROM fooJOIN barON ( foo. foreign_id= bar. id)" を MySQL にポップすると、まったく同じ結果が得られます)。

Kohana さん、MySQL で列エイリアスを定義できるのと同じように、まさにこの理由で。(詳しくはこちら

クエリを次のように書き換えます。

$results = DB::select('id', 'time', 'foreign_id', array('bar.id', 'bar_id'), 'baz')->from('foo')->join("bar")->on("foo.foreign_id", "=", "bar.id")->execute();

これは以下を返します:

id    time          foreign_id      blah_int    bar_id   baz
4     1291851245    3               0           3        52501504
于 2011-06-01T15:17:33.403 に答える