Структура модели в CodeIgniter - PullRequest
0 голосов
/ 26 октября 2019

Последние пару дней я боролся с проблемой разработки приложений (моделей) и не могу сказать, что добился большого прогресса. Я новичок в фреймворках 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_modelcustom_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) объекту.

Я действительно в растерянности. Мне нужны некоторые указатели.


Я знаю, что это не похоже на реальный вопрос программирования и, вероятно, основан на мнении, но мне действительно нужна помощь: |

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...