【问题标题】:Write a Model Class in CodeIgniter with ORM style使用 ORM 风格在 CodeIgniter 中编写模型类
【发布时间】:2013-09-24 00:02:47
【问题描述】:

我考虑过使用像 Doctrine 这样的实际 ORM,然后我发现它的下载链接甚至被破坏了......所有在线教程都可以追溯到 2011 年。另外我必须编写 yaml 文件。

然后我开始尝试用 ORM 样式编写我自己的模型类。

我只是用字段填充它并将其保存到数据库中,这很容易。

但是我在尝试从数据库中检索数据时遇到了问题。

class User extends CI_Model {

    public $id;
    public $email;
    public $displayName;

 public function save() {
  .....
 }

public function search_by_email($email) {
    $user = new User();
    $this->db->select('email')->from('user')->where('email', $email);
    $result = $this->db->get();
    if ($result->num_rows()==0) {
        return false;
    }else {
        foreach ($result->result() as $field) {

        }
    }
}

我通常在 CodeIgniter 中知道,您返回 $query->result(),以及 ORM 自定义,我正在尝试返回一个对象...有没有办法做到这一点?我应该使用什么功能?

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    result 接受一个表示类的字符串,它将实例化并分配结果数据(每个字段作为对象的属性):

    $query = $this->db->query("SELECT * FROM users;");
    
    foreach ($query->result('User') as $row)
    {
       echo $row->name; // call attributes
       echo $row->reverse_name(); // or methods defined on the 'User' class
    }
    

    关于您的评论,我很确定您将 codeigniter has no idea about anything regarding the class 传递给 result 方法。看起来它只是实例化它并为从数据库返回的每个列/值设置属性和值:

    $this->custom_result_object[$class_name][$i] = new $class_name();
    
    foreach ($this->{$_data}[$i] as $key => $value)
    {
        $this->custom_result_object[$class_name][$i]->$key = $value;
    }
    

    【讨论】:

    • 我以前不知道这个。快速提问:CodeIgniter 是否使用字段读取我预先建立的 User 类并使用 $query 结果填充这些字段? CodeIgniter 如何知道哪个数据库字段对应于我的类中的字段?
    【解决方案2】:

    一个与 codeIgniter 配合得很好的 ORM 是 php-activerecord,它基于脱离轨道的活动记录模型。

    您尝试复制“search_by_email”的功能是通过

    Late static binding method.
    

    所以你可能会看到这样调用的函数:

    Object::find_by_email()
    
    Object::search_by_email()
    

    【讨论】:

    • 你能通过Sparks成功安装这个吗?看来我的不工作(安装后...)
    • 我实际上非常努力地让 php-activerecord 工作......我使用 Spark 安装并从 autoload "$autoload['sparks'] = array('php-activerecord/0.0. 2');"并尝试测试它是否适用于 "echo '
      '; var_dump(Test::all()); exit;"我的页面上没有显示任何内容(是的,我创建了一个测试模型文件)
    • 你是否在 core/ 中包含了 loader 文件
    • 现在可以使用了!不太符合我的想象——我仍然需要手动创建数据库表,但感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2011-04-08
    • 2021-02-06
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    相关资源
    最近更新 更多