Дек 04 2008

И снова про основы

Раздел: МоделиМета @ 12:32

Попробую для новичков более подробно описать особенности взаимодействия частей приложения на CakePHP.

Первая основополагающая идея заложена в понятии «Модель». Что такое модель? Это объектно-ориентированное представление данных внутри приложения, с интуитивно-понятным интерфейсом. Под интерфейсом тут надо понимать не внешний вид, а именно способ взаимодействия с другими объектами приложения.

Чтобы было проще понять, приведу пример.

Представим, что у нас есть база данных из двух таблиц — категории и товары. В одной категории может быть несколько товаров. Для того чтобы вывести список всех категорий, в классическом php, прямо по примеру из мануала надо выполнить подключение к серверу БД, выбор базы данных, затем запрос «SELECT * FROM cats». Результатом запроса будет неудобоваримая переменная типа «ресурс», из которой в цикле, построчно, нужно выбирать строки данных. Если в другом месте программы опять понадобится список категорий, но отформатированный по-другому — добро пожаловать снова запрос и цикл.

А как аналогичный запрос выполнить в CakePHP? Подключение к серверу и выбор базы данных заменяются на прописывание настроек в /app/config/database.php и создание файла модели /app/models/cat.php:

<?php
class Cat extends AppModel {
	var $name = 'Cat';
}
?>

В самом же коде приложения (в коде контроллера) вместо SELECT’а и построчной обработки «ресурса» достаточно вызвать

$cats = $this->Cat->find('all');

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

Догадайтесь, как удалить запись из таблицы? Правильно:

$this->Cat->remove($id);

или

$this->Cat->del($id);

А как сохранить запись? Опять элементарно:

$this->Cat->save($data);

Для того чтобы связать таблицы категорий и товаров не надо придумывать сложные запросы для совместного поиска, сохранения и удаления — достаточно прописать еще несколько строк в файле модели по стандартному образцу из документации и «автомагия» CakePHP будет все делать за вас.

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

Теги: , ,

2 Responses to “И снова про основы”

  1. Александр says:

    Ну вот! Надеялся увидеть что-нибудь о взаимодействии, а увидел однотипный пример. Интересует пример межмодульного взаимодействия. Например, для данного случая - как на одной странице отобразить название выбранной категории и список товаров данной категории. То есть, здесь должно быть использование модели категорий (для получения наименования категории) и использование модели товаров (для получения списка товаров). Как это реализовать?

  2. Мета says:

    Очень просто - организуйте связь “один-ко-многим” (hasMany) категорий и товаров. Тогда при поиске категории, например

    $this->Category->find('first', array('conditions'=>array('Category.id'=>$id)));

    будет возвращен массив с информацией о категории и всех входящих в нее товаров.

    Массив будет вида

    Array
    (
        [Cat] => Array
            (
                [id] => 16
                [name] => Категория 1
                ...
            )
    
        [Product] => Array
            (
                [0] => Array
                    (
                        [id] => 191
                        [name] => Товар 1
                        ...
                     )
                [1] => Array
                    (
                        [id] => 191
                        [name] => Товар 2
                        ...
                     )
                  ...
    

    Соответственно такой массив легко обработать или вывести с помощью foreach.

Напиши комментарий!