Вопрос по ORM
Господа, я запутался, прошу разъясните.
Пользуюсь последней версией ЛС, ставлю все обновления с трака, хочется пользоваться всеми предоставляемыми возможностями движка.
Имеется три таблицы в базе данных:
Задача вывести страницу участников турнира (Название команды с лого, Имя игрока ссылкой + аська + ещё набор полей из таблицы пользователя)
Как бы я сделал в обычном проекте, один запрос, с left join, так как у команды может и отсутствовать игрок и передал бы массив в шаблон,
Но ведь хочется по умному, но я не представляю как это сделать грамотно, есть вариант
Это все адски неправильно, всего то хочется, иметь в шаблоне возможность получить все команды со всем набором полей + пользователя заявленного за команду со всем набором его полей.
Наверняка я где-то не дочитал, может просто не нашел, помогите.
Пользуюсь последней версией ЛС, ставлю все обновления с трака, хочется пользоваться всеми предоставляемыми возможностями движка.
Имеется три таблицы в базе данных:
- таблица команд (Team), содержит Id команды, её название, лого и так далее
- таблица пользователей, собственно таблица как у всех
- таблица турнира (Teamsintournament), содержит id турнира, id команды и id пользователя
Задача вывести страницу участников турнира (Название команды с лого, Имя игрока ссылкой + аська + ещё набор полей из таблицы пользователя)
Как бы я сделал в обычном проекте, один запрос, с left join, так как у команды может и отсутствовать игрок и передал бы массив в шаблон,
Но ведь хочется по умному, но я не представляю как это сделать грамотно, есть вариант
$oTeamsInTournament = LS::E()->PluginVs_Stat_GetTeamsintournamentItemsByTournamentId($oBlog->GetTournamentId());
--получаем все записи команд в турнире
$aUserId=array();
$aTeamId=array();
foreach ($oTeamsInTournament as $oTeamInTournament) {
if($oTeamInTournament->getPlayerId()!=0)$aUserId[]=$oTeamInTournament->getPlayerId();
$aTeamId[]=$oTeamInTournament->getTeamId();
}
--создаем и заполняем массивы содержащие id пользователей и команд
$aUsers= $this->User_GetUsersAdditionalData($aUserId);
$aTeams = LS::E()->PluginVs_Stat_GetTeamItemsByTeamIdIn($aTeamId);
--получаем все команды, кстати я не совсем понял зачем убрали ByArray, теперь к объектам не обратиться через $aTeams[$TeamId], теперь $aTeams[просто номер объекта]
foreach ($oTeamsInTournament as $oTeamInTournament) {
if($oTeamInTournament->getPlayerId()!=0)$aTeams[$oTeamInTournament->getTeamId()]->setUser($aUsers[$oTeamInTournament->getPlayerId()]);
}
--в один объект записываем через setUser другой объект
$this->Viewer_Assign('aTeams',$aTeams);
-- и передаем в шаблон
Это все адски неправильно, всего то хочется, иметь в шаблоне возможность получить все команды со всем набором полей + пользователя заявленного за команду со всем набором его полей.
Наверняка я где-то не дочитал, может просто не нашел, помогите.
53 комментария
сейчас подумаю, как лучше поступить в этой ситуации.
и вызывать
$aTeamsInTournament = LS::E()->PluginVs_Stat_GetTeamsintournamentItemsByFilter(array(
Чтобы это исправить, измените файл /classes/modules/user/User.class.php, строку #22:
замените на
а также после строки #40 добавьте код:
а также в файле /classes/modules/user/entity/User.entity.class.php нужно заменить строку #18:
на
В каком файле и строчке показывает ошибку?
Call to a member function getUserLogin() on a non-object
и
на мой взгляд все правильно
т.е. в plugins/sitemap/classes/modules/user/User.class.php
заменяем
на
и после
добавляем
вернул /classes/modules/user/User.class.php и /classes/modules/user/entity/User.entity.class.php и sitemap плагин в изначальное состояние, без ORM
стал падать правильно
без плагина sitemap работает нормально?
1.Вернул класс User и его сущность в исходное состояние без ORM и Parent Init
2.Вернул класс плагина sitemap в исходное состояние
1.Вернул только sitemap в исходное состояние, а класс user оставил с ORM
1.Плагин sitemap выключен, класс user вернул в исходный вид
Все работает
опиши все начальные условия, т.к. я не пойму то ли здесь есть плагин, который использует ORM, то ли нет. Весь порядок действий приводящий к ошибке.
и
приводят к
всеравно продолжает ругаться на
все таже ошибкаUndefined method module: getUserItemsByArrayId
приводит к
я представлял что через данную конструкцию смогу обратиться к полям другой таблицы
возвращает (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30)т.е. те 30 команд что участвую в турнире (они же первые 30 заведенные, проверил, все присутствую в таблице команд с такими team_id)
только что проверил аналогичный пример, — у меня работает.
посмотрел лог запросов, удивлен
1) в aRelations третьим параметром для 'belongs_to' указывается Foreign Key таблицы, я вам написал `user_id` и `team_id`, а в таблице у вас было `user` и `team`.
2) ошибка заключается в том, что имена релейшенов ('user' и 'team') не могут совпадать с именами настоящих полей в базе (`user` и `team`).
В связи с этим я переименовал релейшены в my_user и my_team, а третий параметр — 'user' и 'team'. После этого ->getMyUser()->getLogin() и ->getMyTeam()->getLogo() заработали, но я вам советую оставить все как было, просто изменив в таблице ключи relation key на user_id и team_id.
Тогда получается что в релейшене нельзя указать с каким полем устанавливать связь, т.е. только с primary, правильно?
'my_user' => array(self::RELATION_TYPE_BELONGS_TO, 'ModuleUser_EntityUser', 'поле моей таблицы'),
а допустим указать что я хочу связать не по айди, а по логину, который тоже уникален я не смогу?
и второй вопрос, могу ли я сделать два релейшена с одной таблицей, ну к примеру за одну команду два игрока?
За одну команду может играть два игрока, но тогда вам нужно сделать другой тип отношений — HAS_MANY вместо BELONGS_TO, и тогда foreign key вы указываете уже не в таблице команды, а в таблице пользователя. например:
И таким образом у вас будет работать:
З.Ы.
надеюсь что ответы на вопросы в этом топике помогут кому-нибудь ещё
этот код равносилен
и вернет ассоциативный массив сущностей User с ключами, взятыми из поля `user_id`.
Тестирую функции ORM на плагине Page, постепенно изменяя его.
Пытаюсь вызвать
Пишет
А тот самы класс, который он хочет найти, объявляется как
вместо
если бы это не был плагин.
Получается, из-за приставки «PluginPage_» невозможно найти нужный класс.
Есть ли решение?
Поискал по сайту, почистил /var/www/livestreet/templates/compiled.new
Но не помогло
в методе Init() вашего модуля PluginPage_ModulePage
Странно, что данный код печатает правильный Id, но почему-то не сохраняет его в нужное поле таблицы. Причем читает из этого поля тоже правильно: при закоментированной строке выводит program_id из таблицы. Сущности Program и Day связаны как has_many
В чем может быть загвоздка? Может это баг?
вместо
есть сомнение насчет необходимости более короткой записи…