1

Propel ORM で親名フィールドを 1 対多の関係に作成することは可能ですか?

このタイプの関係は、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

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

テーブル「プロジェクト_タスク」

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 に答える