Я разрабатываю сайт с помощью codeigniter. Теперь, обычно, когда вы используете класс в codeigniter, вы в основном используете его, как если бы это был статический класс. Например, если я возглавляю модель под названием «пользователь», я сначала загружу ее, используя
$this->load->model('user');
и чем, я мог бы вызывать методы в этом пользовательском классе, например
$this->user->make_sandwitch('cheese');
в приложении, которое я создаю, я хотел бы иметь один класс UserManagement, который использует класс под названием «пользователь».
так что, например, я мог бы
$this->usermanager->by_id(3);
и это вернет экземпляр модели пользователя, где id равен 3. Каков наилучший способ сделать это?
Классы моделей в CI не совсем то же самое, что и классы моделей в других синтаксисах. В большинстве случаев модели фактически будут представлять собой какой-то простой объект со слоем базы данных, который взаимодействует с ним. С CI, с другой стороны, Model
представляет интерфейс слоя базы данных, который возвращает общие объекты (они каким-то образом похожи на массивы). Я знаю, я тоже лгала.
Итак, если вы хотите, чтобы ваша модель возвращала то, что не является stdClass
, вам нужно обернуть вызов базы данных.
Итак, вот что я сделал бы:
Создайте user_model_helper с классом модели:
class User_model { private $id; public function __construct( stdClass $val ) { $this->id = $val->id; /* ... */ /* The stdClass provided by CI will have one property per db column. So, if you have the columns id, first_name, last_name the value the db will return will have a first_name, last_name, and id properties. Here is where you would do something with those. */ } }
В usermanager.php:
class Usermanager extends CI_Model { public function __construct() { /* whatever you had before; */ $CI =& get_instance(); // use get_instance, it is less prone to failure // in this context. $CI->load->helper("user_model_helper"); } public function by_id( $id ) { $q = $this->db->from('users')->where('id', $id)->limit(1)->get(); return new User_model( $q->result() ); } }
Используйте абстрактный шаблон фабрики или даже шаблон объекта доступа к данным, который выполняет требуемое вами задание.
class User extend CI_Model { function by_id($id) { $this->db->select('*')->from('users')->where('id', $id)->limit(1); // Your additional code goes here // ... return $user_data; } } class Home extend CI_Controller { function index() { $this->load->model('user'); $data = $this->user->by_id($id); } }