Codeigniter Результат запроса, возвращающий пользовательский объект результата с установщиками

Как именно работает объект 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 передать все атрибуты конструктору, чтобы класс мог заполнять свои собственные данные?

пример класса User

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 заполнял атрибуты класса для меня, вместо этого я хочу, чтобы класс получил эти атрибуты и сам заполнил его так, как он этого требует.

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

Я упростил код, чтобы сделать его более понятным, но вы поняли идею.

4

Другие решения

этот пример контроллера с использованием массива результатов и объекта

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector