Spec-Zone.ru › CodeIgniter 4

Использование модели CodeIgniter

  • Модели
  • Доступ к моделям
  • Модель CodeIgniter
  • Создание вашей модели
    • Подключение к базе данных
    • Настройка вашей модели
  • Работа с данными
    • Поиск данных
    • Сохранение данных
    • Удаление данных
    • Валидация данных
    • Получение правил валидации
    • Плейсхолдеры валидации
    • Защита полей
    • Работа с Query Builder
    • Изменения типа возвращаемого значения во время выполнения
    • Обработка больших объемов данных
  • События модели
    • Определение обратных вызовов
    • Указание обратных вызовов для выполнения
    • Параметры события
    • Изменение данных find*
  • Ручное создание модели

Модели

Модели предоставляют способ взаимодействия со специфической таблицей в вашей базе данных. Они поставляются с методами-помощниками для большинства стандартных способов взаимодействия с таблицей базы данных, включая поиск записей, обновление записей, удаление записей и многое другое.

Доступ к моделям

Модели обычно хранятся в каталоге app/Models. У них должен быть пространство имен, соответствующее их расположению в каталоге, например, namespace App\Models.

Вы можете получить доступ к моделям в своих классах, создав новый экземпляр или используя вспомогательную функцию model().

// Create a new class manually
$userModel = new \App\Models\UserModel();

// Create a new class with the model function
$userModel = model('App\Models\UserModel', false);

// Create a shared instance of the model
$userModel = model('App\Models\UserModel');

// Create shared instance with a supplied database connection
// When no namespace is given, it will search through all namespaces
// the system knows about and attempt to located the UserModel class.
$db = db_connect('custom');
$userModel = model('UserModel', true, $db);

Модель CodeIgniter

CodeIgniter предоставляет класс модели, который обеспечивает несколько полезных функций, включая:

  • автоматическое подключение к базе данных
  • основные методы CRUD
  • валидация в модели
  • автоматическая постраничная навигация
  • и многое другое

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

Создание вашей модели

Чтобы воспользоваться моделью CodeIgniter, просто создайте новый класс модели, который наследуется от CodeIgniter\Model:

<?php

namespace App\Models;

use CodeIgniter\Model;

class UserModel extends Model
{
    // ...
}

Этот пустой класс предоставляет удобный доступ к подключению к базе данных, Query Builder и ряду дополнительных удобных методов.

Если вам потребуется дополнительная настройка в вашей модели, вы можете расширить функцию initialize(), которая будет выполнена сразу после конструктора модели. Это позволяет вам выполнять дополнительные шаги без повторения параметров конструктора, например, расширять другие модели:

<?php

namespace App\Models;

use Modules\Authentication\Models\UserAuthModel;

class UserModel extends UserAuthModel
{
    /**
     * Called during initialization. Appends
     * our custom field to the module's model.
     */
    protected function initialize()
    {
        $this->allowedFields[] = 'middlename';
    }
}

Подключение к базе данных

Когда класс впервые создается, если экземпляр подключения к базе данных не передается в конструктор, он автоматически подключается к группе баз данных по умолчанию, как задано в конфигурации. Вы можете изменить используемую группу на основе модели, добавив свойство DBGroup в ваш класс. Это гарантирует, что внутри модели все ссылки на $this->db выполняются через соответствующее подключение.

<?php

namespace App\Models;

use CodeIgniter\Model;

class UserModel extends Model
{
    protected $DBGroup = 'group_name';
}

Вы должны заменить «group_name» на имя определенной группы баз данных из файла конфигурации базы данных.

Настройка вашей модели

Класс модели имеет несколько опций конфигурации, которые могут быть настроены для обеспечения бесперебойной работы методов класса. Первые две используются всеми методами CRUD, чтобы определить, какую таблицу использовать и как найти необходимые записи:

<?php

namespace App\Models;

use CodeIgniter\Model;

class UserModel extends Model
{
    protected $table      = 'users';
    protected $primaryKey = 'id';

    protected $useAutoIncrement = true;

    protected $returnType     = 'array';
    protected $useSoftDeletes = true;

    protected $allowedFields = ['name', 'email'];

    protected $useTimestamps = false;
    protected $createdField  = 'created_at';
    protected $updatedField  = 'updated_at';
    protected $deletedField  = 'deleted_at';

    protected $validationRules    = [];
    protected $validationMessages = [];
    protected $skipValidation     = false;
}

$table

Указывает таблицу базы данных, с которой эта модель в первую очередь работает. Это относится только к встроенным методам CRUD. Вы не ограничены использованием только этой таблицы в своих запросах.

$primaryKey

Это имя столбца, который однозначно идентифицирует записи в этой таблице. Это не обязательно должно совпадать с первичным ключом, указанным в базе данных, но используется с методами, такими как find(), чтобы знать, к какому столбцу сопоставить указанное значение.

Примечание

Все модели должны иметь указанный primaryKey, чтобы все функции работали как ожидается.

$useAutoIncrement

Указывает, использует ли таблица функцию автоинкремента для $primaryKey. Если установлено значение false, то вы отвечаете за предоставление значения первичного ключа для каждой записи в таблице. Эта функция может быть полезной, когда мы хотим реализовать отношение 1:1 или использовать UUID для нашей модели.

Примечание

Если вы установили $useAutoIncrement на false, убедитесь, что вы установили свой первичный ключ в базе данных на unique. Таким образом, вы гарантируете, что все функции модели будут работать так же, как и раньше.

$returnType

Методы CRUD модели выполнят часть работы за вас и автоматически вернут результирующие данные вместо объекта Result. Эта настройка позволяет определить тип данных, который будет возвращен. Допустимые значения: «массив», «объект» или полное имя класса, который может быть использован с методом getCustomResultObject() объекта Result.

$useSoftDeletes

Если true, то все вызовы методов delete* установят deleted_at в базе данных вместо фактического удаления строки. Это может сохранить данные, когда на них могут ссылаться где-то еще, или может поддерживать «корзину» объектов, которые можно восстановить, или даже просто сохранить их как часть следа безопасности. Если true, методы find* будут возвращать только не удаленные строки, если не вызвать метод withDeleted() до вызова метода find*.

Это требует поля DATETIME или INTEGER в базе данных в соответствии с настройкой $dateFormat модели. По умолчанию имя поля — deleted_at, однако это имя можно изменить на любое имя по вашему выбору, используя свойство $deletedField.

$allowedFields

Этот массив следует обновить с именами полей, которые можно установить во время методов save, insert или update. Любые имена полей, отличные от этих, будут отброшены. Это помогает защитить от простого извлечения данных из формы и отправки их во все модели, что может привести к уязвимостям массового назначения.

$useTimestamps

Это булево значение определяет, добавляется ли текущая дата автоматически ко всем операциям вставки и обновления. Если true, устанавливает текущее время в формате, указанном в $dateFormat. Для этого требуется, чтобы в таблице были столбцы с именами «created_at» и «updated_at» в соответствующем типе данных.

$createdField

Указывает поле базы данных, которое используется для отметки времени создания записи данных. Оставьте пустым, чтобы не обновлять его (даже если $useTimestamps включен)

$updatedField

Указывает поле базы данных, которое должно использоваться для сохранения отметки времени обновления записи данных. Оставьте пустым, чтобы не обновлять его (даже если useTimestamps включен)

$dateFormat

Это значение работает с $useTimestamps и $useSoftDeletes, чтобы убедиться, что в базу данных вставляется правильный тип значения даты. По умолчанию создаются значения DATETIME, но допустимые варианты: datetime, date или int (временная метка PHP). Использование «useSoftDeletes» или «useTimestamps» с недопустимым или отсутствующим dateFormat приведет к возникновению исключения.

$validationRules

Содержит массив правил валидации, как описано в Как сохранить ваши правила, или строку, содержащую имя группы валидации, как описано в том же разделе. Подробно описано ниже.

$validationMessages

Содержит массив пользовательских сообщений об ошибках, которые следует использовать во время валидации, как описано в Установка пользовательских сообщений об ошибках. Подробно описано ниже.

$skipValidation

Должна ли быть пропущена валидация во время всех inserts и updates. Значение по умолчанию — false, что означает, что данные всегда будут проверены. Это используется в первую очередь методом skipValidation(), но может быть изменено на true, чтобы эта модель никогда не выполняла валидацию.

$beforeInsert $afterInsert $beforeUpdate $afterUpdate $afterFind $afterDelete

Эти массивы позволяют вам указать методы обратного вызова, которые будут вызываться в указанное время в имени свойства.

$allowCallbacks

Должны ли использоваться описанные выше обратные вызовы.

Работа с данными

Поиск данных

Предоставляется несколько функций для выполнения основных операций CRUD над вашими таблицами, включая find(), insert(), update(), delete() и другие.

find()

Возвращает одну строку, где первичный ключ совпадает со значением, переданным в качестве первого параметра:

$user = $userModel->find($user_id);

Значение возвращается в формате, указанном в $returnType.

Вы можете указать более одной строки для возврата, передав массив значений первичного ключа вместо одного:

$users = $userModel->find([1,2,3]);

Если не передано никаких параметров, возвращаются все строки в таблице модели, фактически действуя как findAll(), хотя и менее явно.

findColumn()

Возвращает null или индексированный массив значений столбца:

$user = $userModel->findColumn($column_name);

$column_name должен быть именем одного столбца, иначе вы получите DataException.

findAll()

Возвращает все результаты:

$users = $userModel->findAll();

Этот запрос можно изменить, вставляя команды Query Builder по мере необходимости перед вызовом этого метода:

$users = $userModel->where('active', 1)
                   ->findAll();

Вы можете передать значения limit и offset в качестве первого и второго параметров соответственно:

$users = $userModel->findAll($limit, $offset);

first()

Возвращает первую строку в наборе результатов. Это лучше всего использовать в сочетании с конструктором запросов.

$user = $userModel->where('deleted', 0)
                  ->first();

withDeleted()

Если $useSoftDeletes имеет значение true, то методы find* не будут возвращать строки, где ‘deleted_at IS NOT null’. Чтобы временно переопределить это, вы можете использовать метод withDeleted() перед вызовом метода find*.

// Only gets non-deleted rows (deleted = 0)
$activeUsers = $userModel->findAll();

// Gets all rows
$allUsers = $userModel->withDeleted()->findAll();

onlyDeleted()

В то время как withDeleted() возвращает как удаленные, так и не удаленные строки, этот метод изменяет последующие методы find* для возврата только мягко удаленных строк:

$deletedUsers = $userModel->onlyDeleted()->findAll();

Сохранение данных

insert()

В этот метод передается ассоциативный массив данных в качестве единственного параметра для создания новой строки данных в базе данных. Ключи массива должны совпадать с именем столбцов в $table, а значения массива — со значениями, которые нужно сохранить для этого ключа:

$data = [
    'username' => 'darth',
    'email'    => 'd.vader@theempire.com',
];

$userModel->insert($data);

update()

Обновляет существующую запись в базе данных. Первый параметр — $primaryKey записи, которую нужно обновить. В этот метод передается ассоциативный массив данных во втором параметре. Ключи массива должны совпадать с именем столбцов в $table, а значения массива — со значениями, которые нужно сохранить для этого ключа:

$data = [
    'username' => 'darth',
    'email'    => 'd.vader@theempire.com',
];

$userModel->update($id, $data);

Несколько записей могут быть обновлены с помощью одного вызова, передав массив первичных ключей в качестве первого параметра:

$data = [
    'active' => 1,
];

$userModel->update([1, 2, 3], $data);

Когда вам нужно более гибкое решение, вы можете оставить параметры пустыми, и это будет работать как команда update в Query Builder, с дополнительными преимуществами валидации, событий и т.д.:

$userModel
    ->whereIn('id', [1,2,3])
    ->set(['active' => 1])
    ->update();

save()

Это обёртка вокруг методов insert() и update(), которая автоматически обрабатывает вставку или обновление записи, основываясь на том, находит ли она ключ массива, соответствующий значению $primaryKey:

// Defined as a model property
$primaryKey = 'id';

// Does an insert()
$data = [
    'username' => 'darth',
    'email'    => 'd.vader@theempire.com',
];

$userModel->save($data);

// Performs an update, since the primary key, 'id', is found.
$data = [
    'id'       => 3,
    'username' => 'darth',
    'email'    => 'd.vader@theempire.com',
];
$userModel->save($data);

Метод save также может значительно упростить работу с объектами результатов пользовательских классов, распознавая не-простой объект и извлекая его публичные и защищенные значения в массив, который затем передается соответствующему методу insert или update. Это позволяет работать с классами сущностей очень чистым способом. Классы сущностей — это простые классы, представляющие одну инстанцию объекта, например, пользователя, записи блога, задачи и т. д. Этот класс отвечает за поддержание бизнес-логики, связанной с самим объектом, например, за форматирование элементов определенным способом и т. д. Они не должны иметь представления о том, как они сохраняются в базе данных. В простейшем виде они могут выглядеть так:

namespace App\Entities;

class Job
{
    protected $id;
    protected $name;
    protected $description;

    public function __get($key)
    {
        if (property_exists($this, $key)) {
            return $this->$key;
        }
    }

    public function __set($key, $value)
    {
        if (property_exists($this, $key)) {
            $this->$key = $value;
        }
    }
}

Очень простая модель для работы с этим может выглядеть так:

use CodeIgniter\Model;

class JobModel extends Model
{
    protected $table = 'jobs';
    protected $returnType = '\App\Entities\Job';
    protected $allowedFields = [
        'name', 'description'
    ];
}

Эта модель работает с данными из таблицы jobs и возвращает все результаты как экземпляр App\Entities\Job. Когда вам нужно сохранить эту запись в базе данных, вам нужно либо написать пользовательские методы, либо использовать метод save() модели для проверки класса, получения любых публичных и частных свойств и сохранения их в базе данных:

// Retrieve a Job instance
$job = $model->find(15);

// Make some changes
$job->name = "Foobar";

// Save the changes
$model->save($job);

Примечание

Если вы часто работаете с сущностями, CodeIgniter предоставляет встроенный класс сущностей, который предоставляет несколько удобных функций, упрощающих разработку сущностей.

Удаление данных

delete()

Принимает значение первичного ключа в качестве первого параметра и удаляет соответствующую запись из таблицы модели:

$userModel->delete(12);

Если значение $useSoftDeletes модели равно true, это обновит строку, установив deleted_at на текущую дату и время. Вы можете принудительно выполнить постоянное удаление, установив второй параметр в true.

Массив первичных ключей может быть передан в качестве первого параметра для удаления нескольких записей одновременно:

$userModel->delete([1,2,3]);

Если параметры не переданы, будет действовать как метод delete Query Builder, требуя предварительно выполнить вызов where:

$userModel->where('id', 12)->delete();

purgeDeleted()

Очищает таблицу базы данных, выполняя постоянное удаление всех строк, у которых ‘deleted_at IS NOT NULL’.

$userModel->purgeDeleted();

Валидация данных

Для многих людей валидация данных в модели — это предпочтительный способ обеспечения соответствия данных единому стандарту без дублирования кода. Класс модели предоставляет способ автоматической валидации всех данных перед сохранением в базе данных с методами insert(), update() или save().

Первый шаг — заполнить свойство класса $validationRules полями и правилами, которые должны быть применены. Если у вас есть пользовательские сообщения об ошибках, которые вы хотите использовать, поместите их в массив $validationMessages:

class UserModel extends Model
{
    protected $validationRules    = [
        'username'     => 'required|alpha_numeric_space|min_length[3]',
        'email'        => 'required|valid_email|is_unique[users.email]',
        'password'     => 'required|min_length[8]',
        'pass_confirm' => 'required_with[password]|matches[password]',
    ];

    protected $validationMessages = [
        'email'        => [
            'is_unique' => 'Sorry. That email has already been taken. Please choose another.',
        ],
    ];
}

Другой способ установить правила валидации для полей с помощью функций,

setValidationRule($field, $fieldRules)
Параметры:
  • $field (строка) –
  • $fieldRules (массив) –

Эта функция установит правила валидации для поля.

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

$fieldName = 'username';
$fieldRules = 'required|alpha_numeric_space|min_length[3]';

$model->setValidationRule($fieldName, $fieldRules);
setValidationRules($validationRules)
Параметры:
  • $validationRules (массив) –

Эта функция установит правила валидации.

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

$validationRules = [
    'username' => 'required|alpha_numeric_space|min_length[3]',
    'email' => [
        'rules'  => 'required|valid_email|is_unique[users.email]',
        'errors' => [
            'required' => 'We really need your email.',
        ],
    ],
];
$model->setValidationRules($validationRules);

Другой способ установить сообщения об ошибках для полей с помощью функций,

setValidationMessage($field, $fieldMessages)
Параметры:
  • $field (строка) –
  • $fieldMessages (массив) –

Эта функция установит сообщения об ошибках для полей.

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

$fieldName = 'name';
$fieldValidationMessage = [
    'required' => 'Your name is required here',
];
$model->setValidationMessage($fieldName, $fieldValidationMessage);
setValidationMessages($fieldMessages)
Параметры:
  • $fieldMessages (массив) –

Эта функция установит сообщения об ошибках.

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

$fieldValidationMessage = [
    'name' => [
        'required'   => 'Your baby name is missing.',
        'min_length' => 'Too short, man!',
    ],
];
$model->setValidationMessages($fieldValidationMessage);

Теперь, когда вы вызываете методы insert(), update() или save(), данные будут проверены. Если проверка завершится неудачей, модель вернет булево значение false. Вы можете использовать метод errors() для извлечения ошибок валидации:

if ($model->save($data) === false)
{
    return view('updateUser', ['errors' => $model->errors()]);
}

Это возвращает массив с именами полей и соответствующими ошибками, которые можно использовать для отображения всех ошибок в верхней части формы или для их индивидуального отображения:

<?php if (! empty($errors)) : ?>
    <div class="alert alert-danger">
    <?php foreach ($errors as $field => $error) : ?>
        <p><?= $error ?></p>
    <?php endforeach ?>
    </div>
<?php endif ?>

Если вы предпочитаете организовать правила и сообщения об ошибках в файле конфигурации валидации, вы можете это сделать и просто установить $validationRules в имя группы правил валидации, которую вы создали:

class UserModel extends Model
{
    protected $validationRules = 'users';
}

Получение правил валидации

Вы можете получить правила валидации модели, обратившись к свойству validationRules:

$rules = $model->validationRules;

Вы также можете получить только подмножество этих правил, вызвав метод доступа напрямую с параметрами:

$rules = $model->getValidationRules($options);

Параметр $options — это ассоциативный массив с одним элементом, ключ которого — «except» или «only», а значение — массив имен интересующих полей.:

// get the rules for all but the "username" field
$rules = $model->getValidationRules(['except' => ['username']]);
// get the rules for only the "city" and "state" fields
$rules = $model->getValidationRules(['only' => ['city', 'state']]);

Плейсхолдеры валидации

Модель предоставляет простой метод для замены частей ваших правил на основе данных, передаваемых в неё. Это может показаться довольно необычным, но особенно удобно с правилом валидации is_unique. Плейсхолдеры — это просто имя поля (или ключ массива), переданного как $data, окружённое фигурными скобками. Он будет заменён **значением** соответствующего поля входных данных. Пример должен прояснить это:

protected $validationRules = [
    'email' => 'required|valid_email|is_unique[users.email,id,{id}]'
];

В этом наборе правил говорится, что адрес электронной почты должен быть уникальным в базе данных, за исключением строки, у которой id соответствует значению плейсхолдера. Предположим, что данные POST формы имели следующее:

$_POST = [
    'id' => 4,
    'email' => 'foo@example.com'
];

тогда плейсхолдер {id} будет заменён числом **4**, что даст следующее переработанное правило:

protected $validationRules = [
    'email' => 'required|valid_email|is_unique[users.email,id,4]'
];

Таким образом, он проигнорирует строку в базе данных, у которой id=4, при проверке уникальности электронной почты.

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

Защита полей

Для защиты от атак с массовым назначением полей класс модели **требует**, чтобы вы перечислили все имена полей, которые могут быть изменены во время вставки и обновления, в свойстве класса $allowedFields. Любые данные, предоставленные сверх этого списка, будут удалены перед обращением к базе данных. Это отлично подходит для предотвращения изменения временных меток или первичных ключей.

protected $allowedFields = ['name', 'email', 'address'];

Иногда вам потребуется изменить эти элементы. Это часто происходит во время тестирования, миграций или посева. В таких случаях вы можете включить или выключить защиту:

$model->protect(false)
      ->insert($data)
      ->protect(true);

Работа с Query Builder

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

$builder = $userModel->builder();

Этот конструктор уже настроен с таблицей модели $table. Если вам нужен доступ к другой таблице, вы можете передать её в качестве параметра, но имейте в виду, что это не вернёт общий экземпляр:

$groupBuilder = $userModel->builder('groups');

Вы также можете использовать методы Query Builder и методы CRUD модели в одной цепочке вызовов, что позволит использовать их очень элегантно:

$users = $userModel->where('status', 'active')
                   ->orderBy('last_login', 'asc')
                   ->findAll();

Примечание

Вы также можете беспрепятственно получить доступ к подключению базы данных модели:

$user_name = $userModel->escape($name);

Изменение типа возвращаемого значения во время выполнения

Вы можете указать формат, в котором данные должны возвращаться при использовании методов find*() в виде свойства класса $returnType. Возможно, в некоторых случаях вам захочется получить данные в другом формате. Модель предоставляет методы, которые позволяют вам сделать именно это.

Примечание

Эти методы изменяют только тип возвращаемого значения для следующего вызова метода find*(). После этого он сбрасывается до своего значения по умолчанию.

asArray()

Возвращает данные из следующего вызова метода find*() в виде ассоциативных массивов:

$users = $userModel->asArray()->where('status', 'active')->findAll();

asObject()

Возвращает данные из следующего вызова метода find*() в виде стандартных объектов или экземпляров пользовательских классов:

// Return as standard objects
$users = $userModel->asObject()->where('status', 'active')->findAll();

// Return as custom class instances
$users = $userModel->asObject('User')->where('status', 'active')->findAll();

Обработка больших объемов данных

Иногда необходимо обрабатывать большие объемы данных, что может привести к исчерпанию памяти. Для упрощения этого можно использовать метод chunk() для получения меньших фрагментов данных, на которых можно выполнить свою работу. Первый параметр — количество строк, которые необходимо получить в одном фрагменте. Второй параметр — замыкание (Closure), которое будет вызываться для каждой строки данных.

Это лучше всего использовать при работе с заданиями cron, экспортом данных или другими крупными задачами.

$userModel->chunk(100, function ($data) {
    // do something.
    // $data is a single row of data.
});

События модели

Существует несколько точек в процессе работы модели, где можно указать несколько методов обратного вызова для выполнения. Эти методы можно использовать для нормализации данных, хеширования паролей, сохранения связанных сущностей и многого другого. Следующие точки в процессе работы модели могут быть затронуты, каждая через свойство класса: $beforeInsert, $afterInsert, $beforeUpdate, $afterUpdate, $afterFind и $afterDelete.

Определение обратных вызовов

Обратные вызовы задаются путем создания нового метода класса в вашей модели для использования. Этот класс всегда будет получать массив $data в качестве единственного параметра. Точное содержимое массива $data будет варьироваться в зависимости от событий, но всегда будет содержать ключ data, содержащий первичные данные, переданные исходному методу. В случае методов insert* или update*, это будут пары ключ/значение, которые вставляются в базу данных. Основной массив также будет содержать другие значения, переданные методу, и будет описан позже. Метод обратного вызова должен возвращать исходный массив $data, чтобы другие обратные вызовы имели полную информацию.

protected function hashPassword(array $data)
{
    if (! isset($data['data']['password'])) return $data;

    $data['data']['password_hash'] = password_hash($data['data']['password'], PASSWORD_DEFAULT);
    unset($data['data']['password']);

    return $data;
}

Указание обратных вызовов для выполнения

Вы указываете, когда выполнять обратные вызовы, добавляя имя метода в соответствующее свойство класса (beforeInsert, afterUpdate и т. д.). К одному событию можно добавить несколько обратных вызовов, и они будут обрабатываться по очереди. Один и тот же обратный вызов можно использовать в нескольких событиях:

protected $beforeInsert = ['hashPassword'];
protected $beforeUpdate = ['hashPassword'];

Кроме того, каждая модель может разрешать (по умолчанию) или запрещать обратные вызовы на уровне класса, установив свойство $allowCallbacks:

protected $allowCallbacks = false;

Вы также можете временно изменить это значение для одного вызова модели, используя метод allowCallbacks():

$model->allowCallbacks(false)->find(1); // No callbacks triggered
$model->find(1); // Callbacks subject to original property value

Параметры события

Поскольку точные данные, передаваемые каждому обратному вызову, немного различаются, вот подробности о том, что содержится в параметре $data, передаваемом в каждое событие:

Событие Содержимое $data
beforeInsert data = пары ключ/значение, которые вставляются. Если в метод insert передается объект или класс Entity, он сначала преобразуется в массив.
afterInsert id = первичный ключ новой строки или 0 при ошибке. data = пары ключ/значение, вставляемые. result = результаты метода insert() используемого через Query Builder.
beforeUpdate id = массив первичных ключей строк, которые обновляются. data = пары ключ/значение, которые вставляются. Если в метод insert передается объект или класс Entity, он сначала преобразуется в массив.
afterUpdate id = массив первичных ключей строк, которые обновляются. data = пары ключ/значение, которые обновляются. result = результаты метода update() используемого через Query Builder.
beforeFind Имя вызываемого метода, был ли запрошен singleton, и эти дополнительные поля:
  • first()
Дополнительных полей нет
  • find()
id = первичный ключ искомой строки.
  • findAll()
limit = количество строк для поиска. offset = количество строк, которые нужно пропустить при поиске.
afterFind То же, что и beforeFind, но включая результирующие строки данных или null, если результат не найден.
beforeDelete Различается в зависимости от метода delete*. Смотрите ниже:
  • delete()
id = первичный ключ удаляемой строки. purge = булево значение, указывает, следует ли жестко удалить строки с мягким удалением.
afterDelete id = первичный ключ удаляемой строки. purge = булево значение, указывает, следует ли жестко удалить строки с мягким удалением. result = результат вызова delete() в Query Builder. data = не используется.

Изменение данных find*

Методы beforeFind и afterFind могут возвращать измененный набор данных для переопределения обычного ответа модели. Для afterFind любые изменения, внесенные в data в возвращаемом массиве, будут автоматически переданы в вызывающий контекст. Для того, чтобы beforeFind перехватывал поток поиска, он также должен возвращать дополнительный булевый параметр, returnData:

protected $beforeFind = ['checkCache'];
// ...
protected function checkCache(array $data)
{
    // Check if the requested item is already in our cache
    if (isset($data['id']) && $item = $this->getCachedItem($data['id']])) {
        $data['data']       = $item;
        $data['returnData'] = true;

        return $data;
    }

    // ...
}

Создание модели вручную

Для создания модели в вашем приложении вам не нужно расширять какой-либо специальный класс. Все, что вам нужно, это получить экземпляр подключения к базе данных, и вы готовы к работе. Это позволяет вам обойти возможности, которые предоставляет CodeIgniter Model по умолчанию, и создать полностью настраиваемый опыт.

<?php

namespace App\Models;

use CodeIgniter\Database\ConnectionInterface;

class UserModel
{
    protected $db;

    public function __construct(ConnectionInterface &$db)
    {
        $this->db = &$db;
    }
}

© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/user_guide/models/model.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API