繁体   English   中英

Codeigniter查询结果返回带有setter的自定义结果对象

[英]Codeigniter Query result returning Custom result object with setters

CI custome对象如何工作?

根据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为我填充类属性,相反,我希望类接收那些attrs并以适合自己的方式自行填充。

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

在深入研究文档后,我设法弄清楚了:

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();
  }
}

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

此示例控制器使用结果数组和对象

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);
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM