次の 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 クエリのパフォーマンスの問題も回避したいと考えています。
最小限のコードでこれを行うにはどうすればよいですか?
注: この例はデモンストレーションの目的で作成しました。実際のケースでは、非常に多くのテーブルとクラス (カスタム メソッドが定義されています) があります。
皆様、どうもありがとうございました。