我有这两个数据库表:
位置
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 查询性能问题。
我怎样才能用最少的代码做到这一点?
注意:我制作这个示例只是为了演示目的,在我的真实案例中,有很多表和类(其中定义了自定义方法)。
非常感谢大家。