Каким образом реализуется отношение "один ко многим" в фреймворке CodeIgniter?

Как в CodeIgniter создать связь "один ко многим" между таблицами "roles" и "users" для реализации формы авторизации? В таблице "roles" есть поля "id" и "role", а в таблице "users" - поля "id", "login", "password" и "role_id". В Django это возможно выполнить одной строкой кода в модели, но мне не понятно, как применить подобную связь в CodeIgniter. Прошу помощи с примерами кода или инструкциями.
  • 5 декабря 2023 г. 19:13
Ответы на вопрос 2
Во фреймворке CodeIgniter связи между таблицами реализуются на уровне моделей и выполняются вручную, так как сам CodeIgniter не предоставляет встроенных ORM-средств аналогично Django. Связь "один ко многим" обычно реализуется через внешний ключ (`FOREIGN KEY`) в базе данных и соответствующие запросы в моделях приложения.

Для начала необходимо определить, что таблица `users` имеет внешний ключ `role_id`, который ссылается на первичный ключ `id` в таблице `roles`. Эту связь можно создать на уровне базы данных с помощью SQL-запросов или миграций.

Допустим, у нас уже есть две таблицы:

```sql
CREATE TABLE roles (
  id INT AUTO_INCREMENT PRIMARY KEY,
  role VARCHAR(255) NOT NULL
);

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  login VARCHAR(255) NOT NULL,
  password VARCHAR(255) NOT NULL,
  role_id INT,
  FOREIGN KEY (role_id) REFERENCES roles(id)
);
```

Теперь мы напишем модели для работы с каждой таблицей. Ниже представлен пример реализации базовых моделей для таблиц `roles` и `users`.

Для таблицы `roles` может быть примерно такая модель:

```php
class Role_model extends CI_Model {

    public function __construct()
    {
        parent::__construct();
    }
  
    public function get_roles()
    {
        $query = $this->db->get('roles');
        return $query->result();
    }
  
    // Другие методы для работы с ролями...
}
```

Для таблицы `users` модель будет включать метод, который также подгружает роль пользователя:

```php
class User_model extends CI_Model {

    public function __construct()
    {
        parent::__construct();
        $this->load->model('Role_model');
    }
  
    public function get_users_with_roles()
    {
        $this->db->select('users.*, roles.role');
        $this->db->from('users');
        $this->db->join('roles', 'roles.id = users.role_id', 'left');
        $query = $this->db->get();
        return $query->result();
    }

    public function get_user_login_data($login)
    {
        $this->db->select('users.*, roles.role');
        $this->db->from('users');
        $this->db->where('login', $login);
        $this->db->join('roles', 'roles.id = users.role_id', 'left');
        $query = $this->db->get();
        return $query->row();
    }

    // Другие методы для работы с пользователями...
}
```

В контроллере можно было бы использовать метод `get_user_login_data` для получения данных пользователя вместе с его ролью в системе по логину. Эти данные, в частности, могут использоваться для процесса аутентификации и авторизации.

Пример использования в контроллере:

```php
class Auth extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
        $this->load->model('User_model');
    }

    public function login()
    {
        // Получаем данные пользователя по логину.
        $user = $this->User_model->get_user_login_data($login);
        // Здесь могут происходить дополнительные проверки пароля и так далее.

        // Если пароль верный
        if (password_verify($password, $user->password)) {
            // Устанавливаем данные пользователя в сессию
            $this->session->set_userdata('logged_in', $user);
            // Перенаправляем на главную страницу или дашборд
        } else {
            // Отправляем обратно на страницу логина с сообщением об ошибке
        }
    }
}
```

Таким образом, вы можете реализовать связь "один ко многим" в Code
В базе у Codeigniter отсутствуют привычные для пользователей orm связи и orm как таковая.Для получения связанных записей вы должны реализовать это поведение на уровне энтити или модели(для фильтрации списка пользователей по ролям, например).Так же вы можете воспользоваться пакетомtatter/relations.
Похожие вопросы