Работая над проектом с Zend Framework, я использую Propel ORM со многими связанными объектами базы данных. Я новичок в обоих, но у меня есть объектные модели, созданные и работающие. Я просто пытаюсь получить доступ к объекту сейчас.
У меня есть метод для создания нового пользователя, его работоспособности и обновлений связанных строк (не все связанные, но это начало). Теперь я хочу представить «новые» пользовательские данные пользователю системы (пользовательский сборщик). Я верну свое имя пользователя, и теперь я хочу получить «UserLevel» среди нескольких других свойств.
После создания пользователя я вызываю метод findUserByUserName, передавая имя пользователя нового пользователя, я возвращаю все в таблице Users, но мне также нужны свойства из таблицы «AgenciesAndUsers», которые связаны с этим новым пользователем.
Это то, что я пытаюсь, но он доцент, похоже, работает, плюс это не кажется правильным … Я должен был бы передать «Пользователи->» в AgenciesAndUsers, чтобы получить связанные свойства для этого пользователя:
$User = UsersQuery::create()->findOneByUserName($UserName); $UserId = $User->getUserId(); $UserData = AgenciesAndUsersQuery::create()->findOneByUserId($UserId); $data = // merge the two objects return $data;
Здесь я остановился, потому что понял, что если это сработает, я должен передать два объекта обратно моему контроллеру (или тому, что называется моим методом). Есть, подождите … Я знаю, что есть … так что «Как мне» получить доступ к свойствам из связанного объекта? Я знаю, что это половина … или, может быть, вся … причина использования системы ORM в любом случае 🙂
Я попытался отменить то, что я сделал при создании моего пользователя, но я просто не могу это сделать. Кроме того, может быть лучше просто передать данные нового пользователя после создания нового пользователя в этом методе, разве у меня нет постоянного объекта после создания нового пользователя? Но мне еще понадобится метод findUserByUserName.
Вот как я создаю своего нового пользователя, и это данные AgencyAndUser тоже …
$user = new Users(); $user->setActive($Active); $user->setCreatedAt($CreatedAt); $user->setEmailAddress($EmailAddress); $user->setEnabledInForms($EnabledInForms); $user->setFirstName($FirstName); $user->setInitialPassword($InitialPassword); $user->setLastName($LastName); $user->setModifiedAt($ModifiedAt); $user->setPassword($UserPassword); $user->setPhoneNumber($PhoneNumber); $user->setTitle($Title); $user->setUserName($UserName); $user->setUserPasswordActive($UserPasswordActive); $user->save(); $AgnecyAndUser = new AgenciesAndUsers(); $AgnecyAndUser->setAgencyId($AgencyId); $AgnecyAndUser->setUserLevel($UserLevel); // associate the $Users object with the current $AgnecyAndUser $AgnecyAndUser->setUsers($user); $AgnecyAndUser->save();
Изменить: я только понял (посмотрев на мой вопрос), что я мог бы, вероятно, «связать» все эти свойства «Пользователь» в строке вместо повторения «$ User» снова и снова.
Оказалось чисто, прямо из руководства Propel …, которое BTW я прочитал и во многих разделах, просто имея проблемы с запуском в качестве новичка / новичка.
Если вы правильно настроили свои отношения, для объекта должны быть аксессоры:
$user->getAgenciesAndUsers();
Не должно быть причины запрашивать у агентов AgenciesAndUsers отдельно. Фактически, если вы используете JOIN в своем запросе, вам нужно только один раз нажать DB.
Кроме того, если вы havent ушли далеко с этим, я бы переименовал все, чтобы он был сингулярным, т.е. AgencyAndUser
(или, вернее, UserAgency
) и User
.