是否可以在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*"}}}
}
有人帮助我吗?
答案 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);
这不是一个完整的答案,但我希望你能看到这个想法!祝你好运: - )