2011-07-05 7 views
1

私は、これら2つのデータベースのテーブルがあります。カスタムオブジェクト

場所を
ID

ユーザー
ID

LAST_NAMEをLOCATION_ID
first_name

私もユーザー場所クラスを持って、彼らは両方のモデルを拡張し、いくつかのカスタム・メソッドが含まれています。例えば、ユーザークラスには、get_full_name()メソッドがあります。

私はcustom_result_objectはビルトインが、CodeIgniterの中に文書化されていない機能です

$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 

、データをロードするために、次のコードを使用しています。クラス名の文字列を受け取り、それを使ってそのクラスのオブジェクトを作成します。上記のコードで

、私は

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

しかし、あなたが見ることができるように、このようにデータにアクセスすることができ、LOCATION_NAMEは私がしたいことはユーザーで、今ユーザーオブジェクトのフィールドであるオブジェクトは、私はDataMapperのORMまたは任意のOTHを使用したくない

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

、私はこのようにそれを使用することができます場所オブジェクトのフィールドを持っていますまた、N + 1のクエリパフォーマンスの問題を回避したいと考えています。

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

注:実際のケースでは、デモ用にこのサンプルを作成しました。カスタムメソッドが定義されているテーブルとクラスがかなりあります。

皆さん、ありがとうございます。

答えて

0

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

私が考えることのできる唯一の代替方法は、おそらくcall_user_func_array()で直接フィールドの代わりにgetters/settersを使うdb_resultクラスを編集することです。この時点で、ユーザモデルでsetId()関数をコーディングして、userId/foreign keyを受け取ったときに$ locationフィールドを設定することができます。

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; 

    } 

} 

このように、あなたは完全に場所のテーブルをロードするオーバーヘッドを回避します。

+0

これもライブラリに入りますか? – Zalaboza

0

table userからlocation idを取得するには、テーブルの場所からIDでオブジェクトを取得するためにその番号を使用します。それに入れてください。

+0

覚えていないのは等しいresult()vs result_array()違いを見るhttp://stackoverflow.com/questions/16506789 –

関連する問題