如何获取相关对象 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的主要内容,如果未能解决你的问题,请参考以下文章

Propel ORM:如果这样的对象不存在,如何仅保存对象

Propel ORM - 连接不相关的表

php orm 学说如何获取对象及其相关连接

如何使用 Propel ORM 在数据库中查找重复条目?

如何将 Propel ORM 与 Informix 数据库连接

如何检索 Propel 1.6 中每个线程的最新问题?