2010-12-13 12 views
2

Kohanaについて、これらすべての質問をおねがいします。彼らは通常無視されます。私はちょうどバグを見つけたと思う。私は直接関係していない2つのテーブルを結合しています。Kohanaのバグ3 ORM?

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

(phpMyAdminの中で)このようになります表示します:

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

これは、明示的にテーブル名を解決できないクエリを生成

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

お知らせがあります2つのid列、1つはfooテーブル、もう1つはbarです。これは本当の問題です。今、私の結果では、私の結果はfooオブジェクトでなければなりませんので、私のループ

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

...ている場合ので、私は4のIDを取得することを期待し、それがために参加の私に3を与えています。これはORMライブラリのバグですか?別の方法を使用してクエリから結果を制限する必要がありますか?私は実際には、すべてのbarのIDをロードし、次に私のfooのように2つの別のクエリを実行したくないのですが、それは私のように見えます。

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

あなたはそれがあったとして、あなたはORMを使用しない限り、いくつかの列の別名が、しかし、あなたのクエリを動作させるために特定する必要があります。

+0

あなたはhttp://kohanaframework.org/guide/tutorials.orm(ORM関係を試してみました)? foreachのようなもの($ barとしての$ foo-> bars){...} – biakaveron

+0

テーブルは間接的なものを除き、関連していません。彼らは別のテーブルとの関係を共有します。だから、私の代わりにテーブルからのIDを共通にロードすることですが、私はむしろそうしません。 – Tesserex

答えて

1

は、次のような生のクエリではなく、ORMを構築するためにデータベースオブジェクトを使用する必要があります意図されました。 ORMに

を使用して

あなたはORMを使用する場合は、モデル内の関係を定義する必要があります。あなたは、このような関係を通じて、多くを持って使用することができ、あなたのケースでので、彼らは別のテーブルとの関係を共有することを言及:

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 
} 

Kohana 3.1 ORM Reference Guideのようなステートメントを使用して、バーのすべてにアクセスできるようになる は

開始するには良い場所ですあなたは

Kohanaのデータベースオブジェクトおよびクエリビルダを使用してORMとの関係

についての詳細を知りたい場合は、アドホッククエリを好むと行っている場合は、おそらく関係なく、列名が衝突していますクエリビルダを使用して参加しますKohanaを使用している場合や生のクエリ(pop "SELECT * FROM foo JOIN bar ON(fooforeign_id = barid)を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(); 

をこれが返されます:次のように

クエリを書き換え

here for more information参照)

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