Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 加入Codeigniter活动记录返回的自定义对象_Php_Codeigniter_Orm_Codeigniter 2 - Fatal编程技术网

Php 加入Codeigniter活动记录返回的自定义对象

Php 加入Codeigniter活动记录返回的自定义对象,php,codeigniter,orm,codeigniter-2,Php,Codeigniter,Orm,Codeigniter 2,我有两个数据库表: 位置 id 名称 用户 id 位置\u id 姓氏 名字 我还有User和Location类,它们都扩展了Model并包含一些自定义方法。例如,在User类中有一个get\u full\u name()方法 我使用以下代码加载数据 $this->db->select('users.id, locations.name as location_name, users.last_name, users.first_name'); $this->db->fr

我有两个数据库表:

位置
id
名称

用户
id
位置\u id
姓氏
名字

我还有UserLocation类,它们都扩展了Model并包含一些自定义方法。例如,在User类中有一个get\u full\u 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
自定义结果对象是Codeigniter中的一个内置但未记录的函数。它接受一个类名字符串,并将使用它创建该类的对象

通过上面的代码,我可以访问这样的数据

foreach($users as $user)
{
 echo $user->id;
 echo $user->get_full_name();
 echo $user->location_name;
}
foreach($users as $user)
{
 echo $user->id;
 echo $user->get_full_name();
 echo $user->location->name; // Location is an object
}
但正如您所看到的,location\u name现在是User对象的一个字段,我想要的是User对象有一个location对象的字段,允许我这样使用它

foreach($users as $user)
{
 echo $user->id;
 echo $user->get_full_name();
 echo $user->location_name;
}
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查询性能问题

我如何用最少的代码实现这一点

注意:我制作这个示例只是为了演示,在我的实际案例中,有相当多的表和类(其中定义了自定义方法)


非常感谢大家。

我曾为自己提出过同样的问题,但发现最简单的方法是迭代每个结果(在您的情况下为用户),然后选择相应的子对象(位置)并设置为父对象(用户->位置)中的字段


我能想到的唯一替代方法是编辑(或扩展并创建您自己的db集合)db_结果类以使用getter/setter而不是直接字段-可能是使用call_user_func_array()。此时,您可以在用户模型中编写setId()函数,以便在收到userId/外键时设置$location字段。

您考虑过以下几点吗

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;

    }

}

这样,您就完全避免了加载位置表的开销,除非您需要数据,在这种情况下,您可以将数据缓存在对象中以备将来使用。

从表用户获取位置id,使用它的编号按对象id从表位置抓取。然后把它放进去。

这会进入库吗?记住,result()和result\u array()是不相等的,请看区别