【问题标题】:Codeigniter Query result returning Custom result object with settersCodeigniter 查询结果返回带有设置器的自定义结果对象
【发布时间】:2014-10-06 22:36:34
【问题描述】:

CI 客户对象究竟是如何工作的?

根据 CI 文档,您还可以将字符串传递给 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
}
}

这是一个非常好的功能,但 Ci 所做的是它将返回一个 User 对象数组并设置行中的属性。

我有一个问题,我想在设置/获取之前更好地控制要公开访问的属性以及要修改的内容。

我怎样才能做到这一点?我可以告诉 CI 将所有属性传递给构造函数,以便类可以填充自己的数据吗?

示例类用户

class User{
    private $data=array();
    protected $CI;
    //public $id,$name,$dob,$gender,$role,$username,$password,$salt,$picture,$lastactive;
    function __construct($data=null)
    {
        $this->data = $data; // i want to save data to a private var and allow attr. throu getters only
    }
    function set_password($p){
      $this->generateSalt();
      $this->data->password = $p.$this->data->salt;
    }
}

简而言之::

我想使用 custom_result_object,但我不希望 codeigniter 为我填充类属性,而是希望类接收这些属性并以他合适的方式自行填充。

【问题讨论】:

    标签: php codeigniter oop codeigniter-2


    【解决方案1】:

    我在为自己寻找解决方案时发现了您的问题。

    在文档中挖掘了一下之后,我设法弄明白了:

    class user_item {
      // you can declare all the attributes you want as private
      private $id,$name,$dob,$gender,$role,$username,$password,$salt,$picture,$lastactive;
    
      function __construct(){
        // you can use the constructor to format data as needed
        $this->username = strtouppper($this->username);  
      }
    
      public function set_password($p){
        $this->generateSalt();
        $this->password = $p.$this->salt;
      }
    
      public function get_password(){
        return $this->password;
      }
    }
    

    设置完成后,您可以从$this->db->result() 实例化此类

    class User_model extends CI_Model {
       public function get_user($id){
         return $this->db->get_where('users', array('id' => $id), 1)->result('user_item');
       }
    }
    

    并根据需要调用类的任何公共方法或属性

    class Users extends CI_Controller {
      function __construct(){
         $this->load->model('user');
      }
      public function profile($user_id){
        var $myUser = $this->user->get_user($user_id);
        $myUser->set_password('myPassword');
        echo $myUser->get_password();
      }
    }
    

    我已经简化了代码以使其更清晰,但你明白了。

    【讨论】:

    • 但是你把 user_item 类放在哪里了?在图书馆里?
    • @NaturalBornCamper 我会把它和 User_model 放在同一个文件中。因此,当您执行 $this->load->model('user') 时,它会自动加载。
    • 好的,谢谢!太糟糕了,他们似乎没有提供任何相关文档
    【解决方案2】:

    这个使用结果数组和对象的示例控制器

    if ($this->session->userdata('id_jurusan') ==1) {
                $where=array('id_jurusan'=>$this->session->userdata('id_jurusan'));
                $value = $this->session->userdata('id_jurusan');
                $value2 = $this->session->userdata('username');
                $data['rule']=$this->guru_mod->get_where($where,'forward_changing')->result();
                $data['fuzzy']=$this->guru_mod->get_data_all('fuzzy')->result();
                $data['artikel']=$this->guru_mod->get_data_all('artikel')->result();
                $data['kondisi']=$this->guru_mod->get_where($where,'kondisi')->result();
                $data['artikel2'] = $this->guru_mod->get_data_all2('artikel','id_jurusan',$value);
                $data['riwayat_rule'] = $this->guru_mod->get_data_all2('forward_changing','username',$value2);
                $data['kondisi_rule'] = $this->guru_mod->get_data_all2('kondisi','id_jurusan',$value);
                $this->load->view('guru/daftar_rule',$data);
            }
    

    【讨论】:

    • 不鼓励仅使用代码回答,因为它们没有为未来的读者提供太多信息,请对您所写的内容提供一些解释
    猜你喜欢
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    相关资源
    最近更新 更多