2012-03-28 21 views
1

で複数のテーブルを結合します。は、私は次のシナリオを持っているDoctrine2

以下は、それらの間の関係である:

projectは(companyid経由)companyに関連しています。
clientdetailscompanycompanyid経由)に関連しています。

は、projectテーブルに格納されます。
company nameは、companyテーブルに格納されます。
client nameは、clientdetailsテーブルに格納されます。

は、どのように私は教義2を使用して、それぞれのprojectためcompanyテーブルからclientdetailsテーブルとcompany nameに保存されているclient nameとともにprojectテーブルからproject nameを取得することができますか?

答えて

1

これは実際にはこれらのマッピングでは不可能です。少なくとも1つは欠けている: プロジェクトはクライアントの詳細も知っているはずです。

1つのプロジェクトのIDがあるとしますが、簡単に会社の名前を取得できますが、そのプロジェクトに関連するクライアントの詳細行が見つかることはありません。

私はあなたに私が説明するのに役立ちますSQL SELECTを挙げてみましょう:

SELECT p.name, c.name, cd.name FROM project p, company c, clientdetails cd WHERE p.id = GIVEN_ID AND p.companyid = c.id AND cd.companyid = c.id

ので、そのクエリにあなたのプロジェクトのIDを持つGIVEN_IDを置き換えます。これは単純なcompanyidに参加するが、のは、他のを見てみましょうであると今では会社の名前を見つけることは容易になりますが参加:

cd.companyid = c.id

それは簡単に見えますが、実際には、この会社のIDにマッピングされている任意のclientdetails成功した試合になるため、正しいクライアントの名前を得ることは絶対に保証されません。複数のマッチがあるため(複数のクライアントがこの会社に割り当てられている場合)、最初にマッチしたクライアント名が検索されて返されます。これは、常に同じクライアント名を持つことを意味します。

ただし、ProjectからClientdetailsにManyToOneマッピングを追加すると、cd.companyid = c.idcd.id = p.clientdetailsidに置き換えることができ、正しい名前が返されます。

また、あなたはあなたがそのように簡単にこれを行うだろうとdoctrine2使用している場合、クエリのこの種は無用になることに気づくでしょう:

$projectId = 1; //this is an example 
$project = App_Entities_Project::find($projectId); 
$projectName = $project->getName(); 
$companyName = $project->getCompany()->getName(); 
$clientdetailsName = $project->getClient()->getName(); 

乾杯を。

関連する問題