Последние пару дней я боролся с проблемой разработки приложений (моделей) и не могу сказать, что добился большого прогресса. Я новичок в фреймворках PHP. Я использую CodeIgniter в течение последних двух месяцев. Пока все в порядке, но по мере увеличения количества сущностей (таблиц) в приложении я начинаю задумываться, правильно ли я все делаю.
Я не совсем уверен в разнице между Модель и Пользовательский объект результата .
Допустим, у меня есть две базовые таблицы (users
и roles
) и ассоциативная таблица (user_role
). Для таблицы users
я хочу использовать следующие действия:
- создать, получить (пользователь), получить (пользователи), обновить, удалить
И для таблицы roles
:
- создать, получить (роль), получить (роли), обновить, удалить
И для отношения между двумя user_role
:
- назначить роль (пользователю), удалить роль, получить роль
Если бы я должен был создать User_model
, как он должен выглядеть? Я мог бы определить методы, такие как
public function get_user($user_id) {
return $this->db->from("users")->where("id", $user_id)->get()->row_array();
}
, но я не хочу работать с массивами. Я имею в виду, как мне получить роль пользователя? Другой метод?:
public function get_user_role($user_id) {
return $this->db->query("SELECT * FROM roles WHERE id IN (SELECT role_id FROM user_role WHERE user_id = ?)", $user_id)->row_array();
}
Мне нужно сделать:
$this->load->model("user_model");
$user = $this->user_model->get(1); // array
$user_role = $this->user_model->get_user_role($user["id"]); // array
Что если у меня будет больше сущностей (это связано с users
)?
$user_permissions = $this->user_model->get_user_permissions($user["id"]); // array
$user_products = $this->user_model->get_user_products($user["id"]);
$user_tasks = $this->user_model->get_user_tasks($user["id"]);
// etc.
Это выглядит грязно и похоже на плохой дизайн. Если я хочу использовать объект, представляющий строку таблицы, и добавить все другие отношения к объекту, как бы я его спроектировал? Я имею в виду, должен ли я добавлять все необходимые свойства / методы в User_model
, и когда я получаю строку ($this->user_model->get(1)
) из таблицы, вместо массива (row_array()
) возвращаем User_model
(с custom_row_object(0, "User_model")
)? Или должен ли объект, представляющий строку таблицы, быть объектом, отличным от User_model
?
Например:
// model is instantited and accessible at $this->user_model
// since it's automatically instantiated (when loaded), it's not linked to any row
// this model could act as a intermediary between the controller and the database/table
// if it will never be linked to a row, there's no reason to have update, delete, etc. methods on the model
// model's role is to insert rows and get objects that represent table rows
$this->load->model("user_model");
// when requested a table row, we return an object that represents a table row
$user = $this->user_model->get(1); // $user is an object; ...->get()->custom_row_object(0, "UserRow")
$user->get_role(); // role is accessible at $user->role; (this could just be another object: a role object)
$user->role->delete();
$user->get_permissions(); // again, $this->permissions; (could be an object)
Таким образом, я мог бы собрать все другие объекты, связанные с пользователемв одном объекте. Проблема заключается в том, должен ли возвращаемый объект быть моделью (custom_row_object(0, "User_model")
) или совершенно другим объектом, например, UserRow
(custom_row_object(0, "UserRow")
)?
Если я использую другой объект, скажем UserRow
, это означает, что User_model
не будет иметь много свойств / методов, что его можно использовать только при вставке новой строки или получении строки (строк) из таблицы (+ может хранить вспомогательные методы). Я мог бы добавить методы update, delete, get (связанные сущности) ко второму (UserRow
) объекту.
Я действительно в растерянности. Мне нужны некоторые указатели.
Я знаю, что это не похоже на реальный вопрос программирования и, вероятно, основан на мнении, но мне действительно нужна помощь: |