Во фреймворке 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