Page contents

Модели

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

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

Модель можно связывать с другими моделями. Например, модель Recipe может быть связана с Author - автором рецепта, а также с Ingredient - ингридиентами рецепта.

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

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

Модель представляет модель данных. В объектно-ориентированном программировании модель данных - это объект, как: машина, человек или дом. Блог, например, может иметь много постов, а каждый пост много комментариев, то есть Blog, Post и Comment - примеры связанных моделей.

Минимальный код для создания модели в CakePHP:

<?php
class Ingredient extends AppModel {
    public $name = 'Ingredient';
}

Всего лишь с помощью такого простого объявления, модель Ingredient приобретает все функции необходимые для получения, сохранения и удаления данных. Эти методы наследуются от класса Model. Модель Ingredient наследует модель приложения AppModel, которая в свою очередь наследует внутренний класс CakePHP - Model. Именно этот класс предоставляет весь функционал для всех моделей, и модели Ingredient в частности.

Промежуточный класс AppModel пуст, и если вы не создадите свой, берется из папки CakePHP. Функционал, переопределенный в AppModel доступен для всех моделей в приложении. Чтобы сделать это вы должны создать файл AppModel.php в папке Model, как и любую другую модель. Если вы создаете проект используя Bake, то модель сгенерируется автоматически.

См. также поведения или как применить схожую логику к нескольким моделям.

Вернемся к нашей модели Ingredient. Для того чтобы начать с ней работать, создайте PHP файл в папке /app/Model/. Согласно соглашениям имя файла должно совпадать с именем класса, в данном случае это Ingredient.php.

Примечание

CakePHP динамически создаст объект модели, если не сможет найти соответствующий файл в /app/Model. Это означает, что если файл модели назван неправильно (например, ingredient.php, или Ingredients.php), CakePHP будет использовать экземпляр AppModel, вместо желаемой модели, файл которой, с точки зрения CakePHP, отсутствует. Если вы пытаетесь использовать метод, который определен в модели, или использовать поведение назначенное модели, но получаете ошибки SQL с именем вызываемого метода - это верный признак того, что CakePHP не может найти модель. В таком случае проверьте имя файла, кеш приложения, или и то и другое.

Примечание

Некоторые имена классов не могут быть использованы для моделей. Например, “File” не может использоваться, т.к. этот класс уже существует в ядре CakePHP.

После создания и объявления, модель доступна в контроллере. CakePHP автоматически сделает модель доступной в контроллере, если ее имя совпадает с именем контроллера. Например, контроллер IngredientsController автоматически инициализирует модель Ingredient и подключит ее в $this->Ingredient:

<?php
class IngredientsController extends AppController {
    function index() {
        //извлекаем все ингредиенты и передаем их в представление:
        $ingredients = $this->Ingredient->find('all');
        $this->set('ingredients', $ingredients);
    }
}

Связанные модели доступны через главную модель. В следующем примере модель Recipe связана с моделью Ingredient:

<?php
class Recipe extends AppModel {

    function steakRecipes() {
        $ingredient = $this->Ingredient->findByName('Steak');
        return $this->findAllByMainIngredient($ingredient['Ingredient']['id']);
    }
}

В примере показано, как использовать модели, которые уже связаны. Чтобы понять, как устанавливать эти связи см. раздел связь моделей

Подробнее о моделях