1

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

这种类型的关系在 CRM 系统中使用。

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

     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*"}}}
}

有人帮助我吗?

4

1 回答 1

1

您显示的输出看起来好像该toArray函数已用于 Propel 对象,然后是该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);

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

于 2013-11-11T19:26:17.037 回答