Выдано 126277 лицензий

ORM

ORM
#
hostcms
Модератор
Описание ORM в документации: http://www.hostcms.ru/documentation/guide/modules/core/orm/

ПрофильЦитировать выделенное01.06.2012 17:20:22 • Сообщений: 16287
Re: ORM
#
31gorod
Один момент, вы утверждаете что
Цитата:
Создадим модель Book_Model, которую поместим в /modules/book/model.php со следующим кодом:
class Book_Model extends Core_Entity
{
}

здесь код класса Book_Model пустой.
Далее вы сразу пишете
Цитата:

// Create an empty object of model Book_Model
$object = Core_ORM::factory('Book');



Каким образом будет определяться принадлежность модели к таблице `books`?


ПрофильЦитировать выделенное18.07.2012 15:24:33 • Сообщений: 81
Re: ORM
#
hostcms
Модератор
31gorod писал(а):
Каким образом будет определяться принадлежность модели к таблице `books`?

По имени модели - имя модели в нижнем регистре в множественном числе. Если желаете, имя таблицы можно указать явно в модели:
protected $_tableName = 'books';

ПрофильЦитировать выделенное18.07.2012 15:30:25 • Сообщений: 16287
Re: ORM
#
31gorod
Понял, спасибо.
Как быть если в модели используется несколько таблиц? Тогда они определяются связями?
написав в модели

protected $_hasMany = array('comment' => array(
         'foreign_key' => 'book_id'
   ));

как мне обратиться к комментарю книги?

ПрофильЦитировать выделенное18.07.2012 15:42:13 • Сообщений: 81
Re: ORM
#
hostcms
Модератор
31gorod,
в модели не могут быть несколько таблиц, она может быть связана с другими моделями различными связями.
Создать комментарий:
$oComment = Core_Entity::factory('Comment');
$oComment->subject = 'Тема';

Добавить комментарий (в модели комментариев должно быть поле book_id):
$oBook->add($oComment);

Получить все комментарии:
$aComments = $oBook->Comments->findAll();

Удалить все комментарии:
$oBook->Comments->deleteAll();

ПрофильЦитировать выделенное18.07.2012 15:51:33 • Сообщений: 16287
Re: ORM
#
31gorod
На простом примере. Есть таблицы org(id) stuff(id, id_org) auto(id, id_org) pass(id_auto, id_stuff) er модель проста, от org идут связи к stuff и auto, от stuff и auto к pass. Выходит нам нужно создать 4 модели, как объединить их в одном модуле?

ПрофильЦитировать выделенное18.07.2012 16:07:02 • Сообщений: 81
Re: ORM
#
hostcms
Модератор
не понимаю, что Вы вкладываете в " как объединить их в одном модуле"?

ПрофильЦитировать выделенное18.07.2012 16:22:45 • Сообщений: 16287
Re: ORM
#
31gorod
Вероятно я неправильно выразился, ведь это контроллер должен управлять данными этих моделей.
Допустим полный путь модуля modules/test. В директории модуля лежит файл model.php который ассоциирован с одной таблицей. В папке controllers лежит контроллер show.php который управляет данными полученными из одной таблицы. В итоге 1 контроллер управляет 1 таблицей. А нам нужно получать данные от любой из 4х таблиц.
Насколько я понимаю начать необходимо с размещения папок org, stuff, auto, pass в директории модуля(test) и в каждой из них создать файлы model.php?

ПрофильЦитировать выделенное18.07.2012 16:34:56 • Сообщений: 81
Re: ORM
#
hostcms
Модератор
31gorod,
в системе есть несколько видов контроллеров:
1. Контроллеры показа в клиентском разделе, размещаются чаще всего в controller/show.php (Вам они пока не нужны).
2. Частные контроллеры редактирования, унаследованные от типового контроллера редактирования. Используется для модификации формы редактирования. Размещаются в controller/edit.php
3. Контроллер форм центра администрирования Admin_Form_Controller, вызывается в index.php, размещенные в /admin/
4. Другие контроллеры, которые в этом контексте не нужны.

В центре администрирования в основном есть два состояния в модуле:
1. Вывод списка объектов. Например разделы и товары. Формируется в index.php соответствующего раздела в /admin/имя_модуля/. Формируется с помощью Admin_Form_Dataset_Entity (есть и другие датасеты). Если одновременно выводится 2 вида моделей (группы и элементы), то добавляется 2 датасета:
// Источник данных 0
$oAdmin_Form_Dataset = new Admin_Form_Dataset_Entity(
   Core_Entity::factory('Informationsystem_Group')
);

// Ограничение источника 0 по родительской группе
$oAdmin_Form_Dataset->addCondition(
      array('where' =>
         array('parent_id', '=', $iInformationsystemGroupId)
      )
   )
->addCondition(
   array('where' =>
      array('informationsystem_id', '=', $iInformationsystemId)
   )
)->changeField('datetime', 'type', 1);

// Добавляем источник данных контроллеру формы
$oAdmin_Form_Controller->addDataset(
   $oAdmin_Form_Dataset
);

// Источник данных 1
$oAdmin_Form_Dataset = new Admin_Form_Dataset_Entity(
   Core_Entity::factory('Informationsystem_Item')
);

// Ограничение источника 1 по родительской группе
$oAdmin_Form_Dataset->addCondition(
   array('where' =>
      array('informationsystem_group_id', '=', $iInformationsystemGroupId)
   )
)
->addCondition(
   array('where' =>
      array('informationsystem_id', '=', $iInformationsystemId)
   )
);

// Добавляем источник данных контроллеру формы
$oAdmin_Form_Controller->addDataset(
   $oAdmin_Form_Dataset
);


31gorod писал(а):
Насколько я понимаю начать необходимо с размещения папок org, stuff, auto, pass в директории модуля(test) и в каждой из них создать файлы model.php?

Начните с создания моделей и прописывания у них связей.

ПрофильЦитировать выделенное18.07.2012 17:00:31 • Сообщений: 16287
Re: ORM
#
31gorod
Спасибо за подробный ответ.
Вот такая ошибка, о том что нет поля deleted

Exception: Query error 1054: Unknown column 'testfield.deleted' in 'where clause'. Query: SELECT `testfield`.* FROM `testfield` WHERE `testfield`.`deleted` = 0

Как избавиться, не добавляя поле `deleted`?

ПрофильЦитировать выделенное18.07.2012 18:02:05 • Сообщений: 81
Авторизация