4

単純なクエリを実行していて、配列を取得したいと考えています。Kohana 3 ガイドに付属の ORM チュートリアルに基づいて、次のことができると考えました。

ORM::factory('user')->find_all()->as_array();

しかし、それは私にモデルオブジェクトの配列を与えるようです(つまり、配列( User_Model1, User_Model2 ...

ソースを見ると、次のパッチをハッキングすることでこれを簡単に修正できることがわかります。

modules/database/classes/kohana/database/result.php
@@ -94,7 +94,7 @@
                        foreach ($this as $row)
                        {
-                               $results[] = $row;
+                               $results[] = $row->as_array();

これは、ユーザーガイドの内容とより一致しているようです:

ORM の強力な機能は、指定されたレコードを配列として返す ORM::as_array メソッドです。ORM::find_all で使用すると、すべてのレコードの配列が返されます。これが役立つ場合の良い例は、選択リストの場合です。

// ユーザー名の選択フィールドを表示 (ID を値として使用) echo Form::select('user', ORM::factory('user')->find_all()->as_array('id', 'username' ));

これが意図的なものなのか疑問に思っています。もしそうなら、なぜですか? 連想配列の配列を作成したい場合、より良い回避策は何ですか?

4

3 に答える 3

5

ドキュメントに (明らかに?) 表示されているように、これは意図的な動作であるため、その「パッチ」を適用しないでください。特に、ORM (だけでなく) 自体を変更したいためです。

代わりにこれを読んでください:

  • が行のコレクションにas_array()適用された場合、行の配列を返します (各行は配列ではなく個別のオブジェクトです)。
  • 単一の行に適用された場合、行を配列として返します。

したがって、少なくとも 2 つの解決策があります。

  • コレクションを配列に変換した後、各行を明示的に変換します。
  • モジュール コードを変更する代わりに、プロキシ クラスに独自のメトンを追加します (Kohana には、コア クラスから継承する空のクラスがあり、それらをアプリケーション/クラスに配置することでオーバーライドできます)。

この特定のクラスは と呼ばれるKohana_Database_Resultので、 クラスDatabase_Resultを に配置application/class/database/result.phpしてから継承しKohana_Database_Result、必要なものを変更します (変更する必要がある場合)。

于 2012-04-23T07:44:50.827 に答える
0

ORM を使用していますが、その機能は実際には必要ないようです (特に、データベース行を Model オブジェクトとして返すため)。その場合、解決策は Database クラスを直接使用することです。モデルから、次のことができます。

$output = $this->_db->query(Database::SELECT, "select * from users");

デフォルトでDatabase::query()は連想配列を返します。

于 2012-02-19T05:43:57.457 に答える
-1

ORMには、あなたが説明したような方法はありません。Kohana 2.3.4 にはselect_list()メソッドがありましたが、ユーザーガイドに古い (または将来の) バージョンからの間違った情報が含まれている可能性がありますか?

PS。また、DB Result オブジェクトを変更する理由はありませ$rowん。これは、(ORM だけでなく) どのクラスでもかまいません。

于 2010-10-31T20:24:30.810 に答える