Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Модели

Модель — класс, отвечающий за одну таблицу базы данных. В нём указывают имя таблицы и список полей, а готовые методы чтения и записи достаются от базового класса. Контроллер обращается к модели и не пишет 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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.