Модели
Модель — класс, отвечающий за одну таблицу базы данных. В нём указывают имя таблицы и список полей, а готовые методы чтения и записи достаются от базового класса. Контроллер обращается к модели и не пишет SQL сам. Модели лежат в папке app/Models.
Создание модели
php spark make:model PostModelКоманда создаёт файл app/Models/PostModel.php со множеством свойств. Для начала достаточно таких:
// app/Models/PostModel.php
namespace App\Models;
use CodeIgniter\Model;
class PostModel extends Model
{
protected $table = 'posts';
protected $primaryKey = 'id';
protected $returnType = 'array';
protected $allowedFields = ['title', 'body', 'status'];
protected $useTimestamps = true;
}$table — имя таблицы из миграции. $allowedFields — поля, которые разрешено записывать. $useTimestamps заставляет модель саму заполнять столбцы created_at и updated_at.
Модель в контроллере
Объект модели возвращает функция model():
// app/Controllers/Posts.php
namespace App\Controllers;
use App\Models\PostModel;
class Posts extends BaseController
{
public function index(): string
{
$posts = model(PostModel::class)->findAll();
return view('posts/index', ['posts' => $posts]);
}
}findAll() возвращает все строки таблицы — каждую в виде массива. Откройте /posts: вместо статей, записанных в коде, список покажет записи из базы, добавленные сидером.
Одна запись
public function show(int $id): string
{
$post = model(PostModel::class)->find($id);
if ($post === null) {
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
}
return view('posts/show', ['post' => $post]);
}find() ищет запись по первичному ключу и возвращает null, если её нет. Адрес /posts/1 покажет первую статью, а /posts/999 — страницу 404.
Методы чтения
| Вызов | Что возвращает |
|---|---|
findAll() | Все записи |
findAll(10) | Не больше десяти записей |
find(5) | Запись с ключом 5 или null |
where('status', 1)->findAll() | Записи, подходящие под условие |
orderBy('id', 'DESC')->first() | Первую запись по порядку сортировки |
countAllResults() | Число записей |
Создание и изменение
$posts = model(PostModel::class);
$id = $posts->insert([
'title' => 'Новая статья',
'body' => 'Текст статьи',
]);
$posts->update($id, ['status' => 1]);insert() добавляет строку и возвращает её идентификатор, update() меняет запись с указанным ключом. Метод save() сам выбирает действие: если в данных есть ключ id, запись изменяется, иначе создаётся.
$posts->save(['id' => 5, 'title' => 'Новый заголовок']);Удаление
model(PostModel::class)->delete(5);Строка с ключом 5 удаляется из таблицы. Если в модели задать protected $useSoftDeletes = true; и добавить в таблицу столбец deleted_at, запись не стирается, а помечается удалённой и перестаёт попадать в выборки.
Частая ошибка
Поле, которого нет в $allowedFields, модель молча отбрасывает: insert() проходит без ошибок, а значение не сохраняется. Если новый столбец «не записывается», первым делом проверьте этот список. Защита нужна, чтобы посетитель не мог подставить в форму лишнее поле, например is_admin.