Вопрос по записи данных в разные таблицы БД и ORM
Пробую написать плагин вопросов. Делаю по аналогии с топиками. В БД создаю две таблицы для вопросов:
В ActionQuestions.class.php заполняю их:
В итоге получаю ошибку: SQL Error: Unknown column 'text_source' in 'field list'.
На сколько я понимаю, данная ошибка появляется потому что мы пытаемся найти столбец text_source в таблице prefix_question, тогда как он расположен в таблице prefix_question_content. И, если правильно понял, за то, откуда считывать/записывать данные отвечает:
Вопрос: правильно ли я все понял и как в данном случае лучше поступить: объединить таблицы в одну или есть способ указать в какую и что писать?
CREATE TABLE IF NOT EXISTS `prefix_question` ( `question_id` int(11) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(11) unsigned NOT NULL, `question_title` varchar(200) NOT NULL, `question_tags` varchar(250) NOT NULL COMMENT 'tags separated by a comma', `question_date_add` datetime NOT NULL, `question_date_edit` datetime DEFAULT NULL, `question_user_ip` varchar(20) NOT NULL, `question_publish_index` tinyint(1) NOT NULL DEFAULT '0', `question_count_read` int(11) unsigned NOT NULL DEFAULT '0', `question_cut_text` varchar(100) DEFAULT NULL, `question_text_hash` varchar(32) NOT NULL, PRIMARY KEY (`question_id`), KEY `user_id` (`user_id`), KEY `question_date_add` (`question_date_add`), KEY `question_text_hash` (`question_text_hash`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; CREATE TABLE IF NOT EXISTS `prefix_question_content` ( `question_id` int(11) unsigned NOT NULL, `question_text` longtext NOT NULL, `question_text_short` text NOT NULL, `question_text_source` longtext NOT NULL, `question_extra` text NOT NULL, PRIMARY KEY (`question_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
В ActionQuestions.class.php заполняю их:
$oQuestion=Engine::GetEntity('PluginQuestions_Question'); $oQuestion->_setValidateScenario('question'); /** * Заполняем поля для валидации */ $oQuestion->setTitle(strip_tags(getRequestStr('question_title'))); $oQuestion->setTextSource(getRequestStr('question_text')); $oQuestion->setTags(getRequestStr('question_tags')); $oQuestion->setUserId($this->oUserCurrent->getId()); $oQuestion->setDateAdd(date("Y-m-d H:i:s")); $oQuestion->setUserIp(func_getIp());
В итоге получаю ошибку: SQL Error: Unknown column 'text_source' in 'field list'.
На сколько я понимаю, данная ошибка появляется потому что мы пытаемся найти столбец text_source в таблице prefix_question, тогда как он расположен в таблице prefix_question_content. И, если правильно понял, за то, откуда считывать/записывать данные отвечает:
$oQuestion=Engine::GetEntity('PluginQuestions_Question');
Вопрос: правильно ли я все понял и как в данном случае лучше поступить: объединить таблицы в одну или есть способ указать в какую и что писать?
38 комментариев
В конфиг:
Вроде так. Пробуй. Указать можно.
Ее ведь надо заполнять в момент создания топика? Т.е. что-то типа этого:
При редактировании еще нужно удалять все старые теги
это перед
$aTags = explode(',',$oQa->getTags());
Связку можно юзать
Можно конечно m2m, но смысла нет
если у вас есть поле question_tags в таблице
значит нужно либо поле в бд переименовать либо в связке
Ага, разобрался, как раз до этого дошел.
При добавлении записи в экшене запускаю проверку:
Далее, там же, добавляю функцию:
В сущности определяю правила:
И даже при полностью пустых полях запись публикуется (пустая), т.е. поля проходят валидацию. Что я упускаю?
в итоге получаю ошибки:
Подскажите, как правильно записать GetQuestionReadItemsByArray и UpdateQuestionRead?
И оффтопом: а где в движке используется дата прочтения топика?
в корне не верна.
ты можешь юзать либо:
но насколько я понял твой код тебе подойдет следующее выражение:
Дошел до навешивания автокомплита на поле тегов. Сделал следующее:
1. на инпут тегов навесил класс autocomplete-question-tags.
2. в script.js шаблона плагина прописал:
3. Добавил файл ActionAjax.class.php, а в него:
4. в Question.class.php написал:
5. в Question.mapper.class.php:
6. ну и в конфиг —
В итоге постоянный ui-autocomplete-loading, а консоль выдает следующее:
Fatal error: Call to a member function GetQuestionTagsByLike() on null in C:\xampp\htdocs
\livestreet\plugins\questions\classes\modules\question\Question.class.php on line 25
25-я строчка:
Что я делаю не так?
Покопавшись обнаружил, что не срабатывают условия типа т.е. не вытаскивается $oVote. На сколько понял, надо в сущность добавить $aRelations. Сделал так:
и получаю ошибку: Fatal error: Uncaught exception 'Exception' with message 'Undefined method module: getVoteById'.
Подскажите, пожалуйста, в нужную ли сторону я вообще смотрю и в чем тут ошибка.