1

次の 2 つのデータベース テーブルがあります。

ロケーション
ID

ユーザー
ID
location_id
last_name
first_name

UserクラスとLocationクラスもあります。どちらもModelを拡張し、いくつかのカスタム メソッドを含んでいます。たとえば、 Userクラスにはget_full_name()メソッドがあります。

次のコードを使用してデータをロードしています。

$this->db->select('users.id, locations.name as location_name, users.last_name, users.first_name');
$this->db->from('users');
$this->db->join('locations', 'users.location_id = location.id');
$query = $this->db->get();
$users= $query->custom_result_object('User'); //now $users is an array of User object

custom_result_objectは組み込みの関数ですが、Codeigniter には文書化されていません。クラス名の文字列を受け取り、それを使用してそのクラスのオブジェクトを作成します。

上記のコードを使用すると、次のようにデータにアクセスできます。

foreach($users as $user)
{
 echo $user->id;
 echo $user->get_full_name();
 echo $user->location_name;
}

しかし、ご覧のとおり、location_name はUserオブジェクトのフィールドになりました。私が欲しいのは、UserオブジェクトにLocationオブジェクトのフィールドがあり、このように使用できるようにすることです。

foreach($users as $user)
{
 echo $user->id;
 echo $user->get_full_name();
 echo $user->location->name; // Location is an object
}

DataMapper ORM やその他の ORM を使用したくありません。また、N+1 クエリのパフォーマンスの問題も回避したいと考えています。

最小限のコードでこれを行うにはどうすればよいですか?

注: この例はデモンストレーションの目的で作成しました。実際のケースでは、非常に多くのテーブルとクラス (カスタム メソッドが定義されています) があります。

皆様、どうもありがとうございました。

4

3 に答える 3

2

以下のことを考慮しましたか?

class User {

    var location;

    public function location()
    {
        if ( empty($this->location) )
        {
            $ci =& get_instance(); 
            $this->location = $ci->db->get_where('locations', array('id' => $this->location_id))->row();
        }

        return $this->location;

    }

}

このようにして、データが必要でない限り、場所のテーブルをロードするオーバーヘッドを完全に回避できます。データが必要な場合は、将来の使用のためにオブジェクト内にデータをキャッシュします。

于 2012-05-29T16:37:30.590 に答える
0

私は自分自身に同じことを質問しましたが、最も簡単な方法は、各結果(あなたの場合はユーザー)を繰り返し処理し、対応する子(場所)を選択して親オブジェクトのフィールドに設定することです(ユーザー->場所)。

私が考えることができる唯一の代替方法は、db_result クラスを編集 (または独自の db セットを拡張および作成) して、直接フィールドの代わりにゲッター/セッターを使用することです (おそらく call_user_func_array() を使用)。その時点で、ユーザー モデルに setId() 関数をコーディングして、userId/外部キーの受信時に $location フィールドを設定できます。

于 2011-10-12T22:39:11.147 に答える
0

テーブルユーザーから場所IDを取得し、その番号を使用してテーブルの場所からオブジェクトのIDを取得します。そして入れます。

于 2016-03-31T18:05:20.387 に答える