2011-12-23 5 views
0

を生のMySQLを翻訳:私は教義1.2に、テストされ、非常にうまく機能してきた次の生のMySQLクエリを、翻訳時間の一体を抱えている教義1.2に

SELECT 
    r.name AS regionname, 
    s.name AS statename 
FROM 
    job j 
LEFT JOIN 
    community c ON c.id = j.community_id 
LEFT JOIN 
    state s ON s.id = c.state_id 
LEFT JOIN 
    region r ON r.id = s.region_id 
WHERE 
    r.id = 1 

これは動作しません。私は同じことのように気づいた

job: 
columns: 
    id 
    community_id 
relations: 
    community: local_key: community_id, foreign_key: id, foreignAlias: Communitys 

community: 
columns: 
    id 
    state_id 
relations: 
    state: local_key: state_id, foreign_key: id, foreignAlias: States 

state: 
columns: 
    id 
    name 
    region_id 
relations: 
    region: local_key: region_id, foreign_key: id, foreignAlias: Regions 

region: 
columns: 
    id 
    name 

答えて

0

:それは便利である場合

$q = Doctrine_Query::create() 
    ->select('r.name AS regionname', 's.name AS statename') 
    ->from('job j') 
    ->leftJoin('community c ON c.id = j.community_id') 
    ->leftJoin('state s ON s.id = c.state_id') 
    ->leftJoin('region r ON r.id = s.region_id') 
    ->where('r.id = 1') 
    ->execute(); 

はここで、私のDB構造ですよくDoctrine 1.2での結合は、mysqlと少し異なります。結合を行うには、Doctrineが職種の各コンポーネントで作成する関係を活用する必要があります。

私が話しているこれらの関係について、ジョブの基本クラスをチェックすることができます。あなたが外国テーブルの別名を参照する必要が参加を行うには、戻るあなたの質問に

$this->hasOne('community as Communitys', array(
     'local' => 'community_id', 
     'foreign' => 'id')); 

:セットアップ方法では、彼らは、ジョブ・テーブル内のコミュニティの外部キーIDについては、例えば次のようになりキーはに属します。たとえば、あなたが別名コミュニティとコミュニティテーブルに参加したい場合:

->leftJoin('j.Community') 

の代わりに、私は教義1.2ですでに暗示されているので、IDに参加言わなかったことを

community c ON c.id = j.community_id 

お知らせ。しかし、他の何かに参加することもできます。同様に

THEIRに述べたように、以前のコンポーネント2.reference現在queryand にそのエイリアス1.use

に、彼らはあなたに外部キーを持っている他のテーブルに結合する必要がありますしている参加しているテーブルの場合基本クラスも同様です。

だから、あなたはあなたがそれを行うべき方法は、私はあなたがパターンを見ることができると思います。ここから

// join job and community first 
->from('job j') 
->leftJoin('j.Community c') 
// join community to state since they are the ones that are related 
->leftjoin('c.States s') 

ある現在のクエリでの状態にコミュニティに参加したいと言いました。あなたが参加のアイデアはまだ生のSQLと同じであることを見れば一日の終わりには、唯一の違いは、構文は次のとおりです。

SQL構文:

LEFT JOIN 
    community c ON c.id = j.community_id 

DQL構文:

とにかくここでは、あなたの質問に答えるために
->leftJoin('j.Community c') 

参加方法ですやや行われるべきである:詳細な回答のため

$q = Doctrine_Query::create() 
    ->select('*') 
    ->from('job j') 
    ->leftJoin('j.Community c') 
    ->leftJoin('c.State s') 
    ->leftJoin('s.Region r') 
    ->where('r.id = 1') 
    ->execute(); 
+0

感謝を。残念ながら、それは動作していません。私も外国人エイリアスの鍵をかけようとしましたが、それはそれらの人たちにぶら下がります。これは、私がそれらを使用しようとしているときに発生しているエラーです: "未知の関係エイリアスコミュニティ"そして私はそれらのいずれかを試すたびにそれらのエラーを取得します。私は彼らがセットアップ方法と再ポストで何であるか確認します。再度、感謝します。 – Patrick

+0

...それは問題のようです。コミュニティとしてのコミュニティはありません。コミュニティ、配列( '。私のスキーマは外国の別名としてそれを述べているので、私は少し難解です。しかし、私のスキーマはそれを1対1の関係として識別しません。それは問題ですか? – Patrick

+0

update: "as"句を含むようにベースクラスを変更しました(これは悪いフォームであり、最終的に問題を修正する場合はスキーマで変更します)、 "コミュニティ"関係の問題を修正しましたしかし、今は "States"節にぶち壊されて、仕事は国家に関係していると言われています...私のスキーマではない...コミュニティは州に関係しています。ソリューションの考え方は? – Patrick

関連する問題