電子書籍の厳選無料作品が豊富!

いつも勉強させて頂いております。

Doctrineを使って二つのテーブルを結合させ、配列に入れようとしているのですが、方法がわかりませんので、よろしければ教えて下さい。
また、mysql_queryを使う方法でもかまいません。


テーブルを次のようにします。
Table : Student
id,
name

Table : Diary
id,
day

これをIDを基に結合させるためには、どのように書けばいいでしょうか?
次のようにやってみたんですが、うまく行かず、何が悪いのかがわかりません。

$this->tmp = Doctrine_Query::create()
->select('s.id, d.id')
->from('Student s')
->leftJoin('s.id d');
$this->record = $this->tmp->fetchArray();

一番最後の行をコメントアウトすると画面は表示されますので、一番下の行が悪さしているのだと思います。
初歩的な質問になると思いますが、よろしければ教えて下さい。よろしくお願いします。

A 回答 (4件)

No.3に書いたとおり、symfony1.4+Doctrineを使用しているため、そちらの手法とは異なるかもしれませんが、symfonyでの流れを簡単に書いてみます。



1.DB定義をします。

scheme.ymlという設定ファイルにテーブルの列情報やリレーション情報を記述します。
本質問の例ですと、「Diaryテーブルのid はStudentテーブルのidに存在すること」という外部キー制約を記述します。

2.コマンドでモデルクラスを生成します。

scheme.ymlに記述した内容に従ってモデルクラスを生成するコマンドが用意されているので実行します。

3.テーブル等を作成するSQLを生成します。

これも用意されたコマンドを実行すると、DBMSで実行すべきSQLが生成されます。


上記手順で準備すれば、No.3で回答したleftJoinの記述が可能になります。
質問からするとdoctrineを単体で使用されているように見受けられますので、私の回答では役にたたないように思います。
    • good
    • 0
この回答へのお礼

xKENx様

ご回答ありがとうございます。
私もSymfonyを使用しております。scheme.ymlファイルにリレーション情報を記載する必要がある、というところまでは理解しました。ここで関連付けを行っていないからleftjoinが動作しなかった、という理解でいいでしょうか?

関連付ける方法をネットで探しているんですが、どれがそれなのかがわからないという情けない状態です。

ちなみにですが、doctrineやsynfonyを使うにあたって、xKENx様はどのように使い方を理解されていったのでしょうか?
現在一人で勉強を進めている状態ですので、おすすめの参考書やホームページがあれば、それを教えていただけると幸いです。

お礼日時:2011/07/14 12:50

symfony1.4でDoctrineを使っています。



StudentテーブルとDiaryテーブルとの間にリレーション設定されていることが前提ですが、
下記記述でいかがでしょうか。

->leftJoin('s.Diary d')

蛇足ですが、考え方としては、前提としたリレーション設定で Student.idとDiary.idは関連付けられているはずですから、Doctrineへ指示する内容は、「Student(=s)とDiaryをleftJoinしてaliasを d にする」ということになり、上記の記述となっています。
    • good
    • 0
この回答へのお礼

xKENx様

ご回答ありがとうございます。

正直リレーション設定という単語を今初めて聞いた状態です。リレーション設定というのは関連づけるという意味であると調査しましたが、具体的にソースコードに何か記載する必要があるのでしょうか?もしどこかにその設定を記載する必要があるならそちらも教えて頂ければ幸いです。

お手数ですがよろしくお願いします。

お礼日時:2011/07/12 08:06

Doctrine自体がよくわかっていないので回答が予想の範囲を超えませんが



->select('s.id, s.name,d.day')
->from('Student s')
->leftJoin('Diary d ON s.id=d.id');

みたいな感じじゃないですか?
    • good
    • 0
この回答へのお礼

yambejp様

ご回答ありがとうございます。

実験してみたんですが、うまくいきませんでした。もうちょっと悩んでみます。

お礼日時:2011/07/11 18:03

->leftJoin('Diary d ON s.id=d.id');



みたいにするんじゃないんですか?
よくわからないけど、s.idとd.idをSELECTする意味があるかどうかは疑問。
    • good
    • 0
この回答へのお礼

yambejp様

ご回答ありがとうございます。SQLの使い方がよくわかっていないので、ご指摘いただいた通りSELECTの使い方がよくわかっておりませんでした。このままだとidだけしか出てこなくなってしまいます。
よければ追加で教えて頂きたいのですが、教えて頂いた通りに実装してみると、結果としてrecordにはidとnameのみ入っていることが確認できたのですが、dayが入っておりませんでした。arrayにdayも追加するにはどうすればいいのでしょうか?

お礼日時:2011/07/11 17:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!