Propel ORM - 与父名称的一对多关系

时间:2013-07-05 14:15:45

标签: propel

是否可以在Propel ORM中将父名称字段创建为一对多关系。

这种关系在CRM系统中使用。

想象一下,我们有一个任务列表。因此,我们创建了一个任务#1并将其与项目相关联。 任务#2与账户相关(例如创建合同)。 任务#3与Bug Tracker相关(例如修复bug)。 所以,我们有以下关系:

     task_name    | parent_name  | parent_id
--------------------------------------------------
Start a project   | Project      | <project_id>
Create a contract | Account      | <account_id>
Fix a bug         | Bug Tracker  | <bug_id>

是否可以在Propel中实施。如果不是,您能否推荐我使用此功能的另一个ORM。

主要目的是获取包含所有关系值的记录列表。

对于我的示例,它应该看起来像(在JSON中):

{
    "Task_0":{"Id":1,"Name":"Start a project","ParentId":1,"ParentName":"Project","Project":{"Id":1,"Name":"Project-1","Tasks":{"Task_0":"*RECURSION*"}}},
    "Task_1":{"Id":1,"Name":"Create a contract","ParentId":1,"ParentName":"Account","Account":{"Id":1,"Name":"Account-1","Tasks":{"Task_0":"*RECURSION*"}}},
    "Task_2":{"Id":1,"Name":"Fix a bug","ParentId":1,"ParentName":"Bug","Bug":{"Id":1,"Name":"Bug-1","Tasks":{"Task_0":"*RECURSION*"}}}
}

有人帮助我吗?

1 个答案:

答案 0 :(得分:1)

您显示的输出看起来好像已在Propel对象上使用toArray函数,然后使用json_encode函数。如果您在Propel的schema.xml中相互定义外键,这应该有用。

由于项目任务,帐户任务和错误跟踪器任务都有一些共同点,它们都是任务:),我会将它们组织为更通用的任务实体的子类。

你最终会得到一组这样的表:

“任务”

id  | name
------------------------
1   | Start a project
2   | Create a contract
3   | Fix a bug
4   | Start another project
5   | Fix another bug

---------------------------------------

“bugtrack_task”

id  | id_task
---------------
1   | 3
2   | 5

---------------------------------------

“project_task”

id  | id_task
---------------
1   | 1
2   | 4

---------------------------------------

“account_task”

id  | id_task
---------------
1   | 2

最后,您将在schema.xml中定义一个视图。这看起来像这样:

<table name="view_task" phpName="ViewTask" skipSql="true" readOnly="true" description="All my tasks together for display">...</table>

请注意,skipSql属性已设置为true。这将在生成SQL代码时跳过此视图表。 Propel将为您生成类,但不会触及您的数据库。现在,您可以随意手动定义视图,无论您想要什么。

当然,你必须付出一些努力来创建这个视图,但它会得到回报,因为你可以使用像这样的Propel类:

$tasks = ViewTask::create()->find();
$result = array();
foreach($tasks as $task) {
    $result[] = $task->toArray();
}
return json_encode($result);

这不是一个完整的答案,但我希望你能看到这个想法!祝你好运: - )