如何获取相关对象 Propel ORM
Posted
技术标签:
【中文标题】如何获取相关对象 Propel ORM【英文标题】:How to get related object Propel ORM 【发布时间】:2011-03-27 00:18:24 【问题描述】:在使用 Zend 框架进行项目时,我将 Propel ORM 与许多相关的数据库对象一起使用。我对这两者都是新手,但是我创建了对象模型并且可以正常工作。我现在只是想了解对象访问。
我有一个创建新用户的方法,它工作良好并更新相关行(不是每个相关的,但它是一个开始)。现在我想向系统用户(用户创建者)展示“新”用户数据。我找回了用户名,现在我想在其他一些属性中获取“UserLevel”。
创建用户后,我调用我的 findUserByUserName 方法,传递新用户的用户名,我在用户表中返回所有内容,但我还需要与该新用户相关的“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();
编辑:我刚刚意识到(在查看了我发布的问题之后),我可能可以将所有这些“用户”属性“链接”到在线而不是一遍又一遍地重复“$用户”。
结果很干净,直接来自 Propel 手册...顺便说一句,我也阅读了很多部分,只是作为初学者/新手遇到了“启动”问题。
【问题讨论】:
【参考方案1】:如果您的关系设置正确,则应该有对象的访问器:
$user->getAgenciesAndUsers();
不应该有单独查询 AgenciesAndUsers 的理由。事实上,如果您在查询中使用 JOIN,您应该只需要访问数据库一次。
此外,如果您对此还没有走得太远,我会将所有内容重命名为单数,即。 AgencyAndUser
(或更准确地说是UserAgency
)和User
。
【讨论】:
谢谢,我想应该就是这么简单。那么我的'Users'对象应该包含'AgenciesAndUsers'属性吗?我无法重命名所有内容,因为我正在连接现有数据库(使用 Propel 反向运行),并且当需要将所有现有数据导入新应用程序(在 Zend 中重做)时,不要过多地弄乱数据库应该证明方便...我希望 :) 前开发人员将所有内容命名为“Agencies_and_Users”和“Users”,其中一些表的关系深度为 6-8 个表,这真的让我头疼! 现在我明白您为什么说要将其重命名为“User”或“AgenciesAndUser”了...我刚刚发现我需要访问“AgenciesAndUserss”注意最后的额外“s”。可能值得重命名表并重建我的模型。谢谢你帮我找到那个。 查看phpName
元素上的phpName
属性:propelorm.org/wiki/Documentation/1.5/Schema 您可以保留相同的表名,但定义完全不同的类名。
我记得实际上读过它,我想我会仔细研究一下,因为奇怪的方法名称会给我带来一些麻烦,我敢肯定
很高兴我能帮上忙……column
元素上也存在相同的属性,可用于指示类中该列的属性名称……我猜这也可能有用:-)以上是关于如何获取相关对象 Propel ORM的主要内容,如果未能解决你的问题,请参考以下文章