ORM

#
Re: ORM
Ох, какая длинная и полезная тема. Вот мой вопрос:

Получаю Comments:
$aComments = $oBook->Comments->findAll();  // - Это массив объектов.

Как я могу из этих объектов (например из $aComments[0]) получить $oBook ?
Я понимаю, что могу создать отдельную связь в классе Comment, и через нее получать $oComment->Books->findAll(), но это повлечет за собой отдельные запросы к БД, чего хотелось бы избежать.
#
Re: ORM
Вопрос туда же.
Как я понимаю, когда я делаю $oBook->Comments->findAll(); срабатывает конструктор для каждого объекта класса Comment.
Вот в этом конструкторе мне уже нужно иметь $oBook.
Модератор
#
Re: ORM
В системе есть связи один ко многим (hasOne), многие ко многим через промежуточную таблицу (hasMany) и принадлежность belongsTo.
Если у модели комментария описана принадлежность, то ту книгу, которой он принадлежит (а не все книги через findAll(), что крайне неверно) Вы можете получить, например, так
echo $aComments[0]->Book->isbn;
#
Re: ORM
HostCMS писал(а):
Если у модели комментария описана принадлежность, то ту книгу, которой он принадлежит (а не все книги через findAll(), что крайне неверно) Вы можете получить, например, так
echo $aComments[0]->Book->isbn;

Но ведь это и вызовет отдельный запрос к БД?
Что такое "isbn"? Сделал полный поиск по папке "modules" и не нашел ни одного вхождения.
Модератор
#
Re: ORM
Levsha,
в каком-то случае вызовет, в каком-то нет. Над ORM есть надстройки, кэширующие в памяти объекты. Если информация была выбрана в этот сеанс и еще не вытеснена из кэша - то запроса не будет.

ISBN дан просто для примера, выведите name
#
Re: ORM
Спасибо.

У меня есть таблица, в которой нет primary id.
Это связующая таблица, для трех других таблиц, то есть в ней только идентификаторы. Уникально только вхождение всех трех полей. Как мне сделать удаление одной строки из этой таблицы?
Полагаю:
$oKey = Core_Entity::factory('Key');
$oKey->queryBuilder()
   ->where('key_id', '=', 100)
   ->where('tag_id', '=', 200)
   ->where('word_id', '=', 300);
$oKey->delete();
но не уверен
Модератор
#
Re: ORM
полагаете неверно. Нет find(), нет самого факта поиска объекта.

$oTmpKey = Core_Entity::factory('Key');
$oTmpKey->queryBuilder()
   ->where('key_id', '=', 100)
   ->where('tag_id', '=', 200)
   ->where('word_id', '=', 300);
$oKey = $oTmpKey->find();
if (!is_null($oKey))
{
$oKey->delete();
}


Обратите внимание, find() очень коварный метод. Если не нашлось объекта, то вернет NULL
#
Re: ORM
Имеется класс

class PHPBB_Post_Model extends Core_Entity
{
   protected $_marksDeleted = NULL;
   
   protected $_primaryKey = 'post_id';

   protected $_modelName = 'phpbb_post';

   protected $_belongsTo = array(
      'phpbb_topic' => array( 'foreign_key' => 'topic_id'),
      'user' => array()
   );
}

Таблица

`phpbb_posts` (
   `post_id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
   `topic_id` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
   `post_subject` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
   PRIMARY KEY (`post_id`),
   INDEX `topic_id` (`topic_id`),
   FULLTEXT INDEX `post_subject` (`post_subject`)
)

данные

(1, 3, 'Тест'),
(2, 3, 'Re: Тест'),
(3, 3, 'Re: Тест'),
(4, 3, 'Re: Тест'),

И класс

class PHPBB_Topic_Model extends Core_Entity
{
   protected $_marksDeleted = NULL;
   
   protected $_primaryKey = 'topic_id';

   protected $_modelName = 'phpbb_topic';

   protected $_hasMany = array(
      'phpbb_post' => array('foreign_key' => 'topic_id'),
   );
}

таблица

`phpbb_topics` (
   `topic_id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
   `topic_last_post_id` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
   `topic_title` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8_bin',
   PRIMARY KEY (`topic_id`)
)

данные
(3, 4, 'Тест')

При попытке сделать
$oPHPBB_Post = Core_Entity::factory('phpbb_post',1);
echo $oPHPBB_Post->Phpbb_Topic->topic_last_post_id;

Ошибка
Unknown column 'phpbb_topics.post_id' in 'where clause'. Query: SELECT * FROM `phpbb_topics` WHERE `phpbb_topics`.`post_id` = '3' LIMIT 1

Почему так и как решить?
HostDev.pw - модули для HostCMS, Telegram: @hostdev
#
Re: ORM
Заметил, что find() не находит элемент, точнее как-бы находит, но его свойства пустые и также что интересно id соответствует , а findAll() находит.
С shop_item такая же история

$oItems = Core_Entity::factory('informationsystem_item');
$oItems->queryBuilder()
   ->where('informationsystem_id', '=', 1)
   ->where('name', '=','NVIDIA готовит 55-нм версию G92 для схватки с AMD RV770?');
$oItem = $oItems->find();
echo 'каран-',$oItem->name,'-даш';

Будет выведено "каран--даш", но не "каран-NVIDIA готовит 55-нм версию G92 для схватки с AMD RV770?-даш"

Проверено на 6.1.0, 6.1.3, 6.1.4
HostDev.pw - модули для HostCMS, Telegram: @hostdev
Модератор
#
Re: ORM
EugenyP,
В модели PHPBB_Post_Model вместо

'phpbb_topic' => array( 'foreign_key' => 'topic_id'),


будет:

'phpbb_topic' => array('foreign_key' => 'topic_id', 'primary_key' => 'topic_id'),
Вы только что начали читать предложение, чтение которого вы уже заканчиваете.
Авторизация