2011-12-31 17 views
1

私の目標は、ユーザー名と姓を使って、また、Recrutation YearとSemesterを介してドキュメントを検索することです。 文書は宣言のみに関連しています。つまり、文書が実際に1つの宣言と宣言に接続されています。Yiiフレームワーク - 同じ "through"テーブルを介した2つの関係

宣言はOutgoingStudentおよびRecrutationに関連しています。

したがって、ドキュメントを照会するときに、Declarationテーブルを使用してOutgoingStudentとRecrutationsも照会します。

ドキュメント内の関係のための私のコード:

return array(
         'declaration' => array(self::BELONGS_TO, 'Declaration', 'DeclarationID'), 
      'outgoingStudentUserIdUser' => array(self::HAS_ONE, 'OutgoingStudent', 'OutgoingStudent_User_idUser','through'=>'declaration',), 
       'Recrutation' => array(self::HAS_ONE, 'Recrutation', 'Recrutation_RecrutationID','through'=>'declaration'), 
       ); 

そして今、私は、クエリを作りたい検索()関数の中で - >

'declaration','outgoingStudentUserIdUser' and 'Recrutation': 

       $criteria->with = array('declaration','Recrutation','outgoingStudentUserIdUser'); 

で、私はこのエラーを取得しています:

CDbCommand nie zdołał wykonać instrukcji SQL: SQLSTATE[42000] [1066] Not unique table/alias: 'declaration'. The SQL statement executed was: SELECT COUNT(DISTINCT t . DeclarationID) FROM Documents t LEFT OUTER JOIN Declarations declaration ON (t . DeclarationID = declaration . idDeclarations) LEFT OUTER JOIN Recrutation Recrutation ON (declaration . Recrutation_RecrutationID = Recrutation . RecrutationID) LEFT OUTER JOIN Declarations declaration ON (t . DeclarationID = declaration . idDeclarations) LEFT OUTER JOIN OutgoingStudent outgoingStudentUserIdUser ON (declaration . OutgoingStudent_User_idUser = outgoingStudentUserIdUser . User_idUser)

$criteria->with = array('declaration','Recrutation')または$criteria->with = array('declaration','outgoingStudentUserIdUser')のみを使用する場合は、bその他

おそらくそれは他の方法で行う必要がありますが、どうすればよいですか?

答えて

2

私はあなたに伝えたいことがたくさんあります!ここにあります:

リレーションシップ関数の宣言は非常に面倒ですが、私はそれがあなたがしたいことをしているのかどうかは分かりません。

まず、 'outgoingStudentUserIdUser'は関係のひどい名前のように見えます。結局、関係は 'ids'だけでなく、outgoingStudentUserのインスタンスにも関係します。だから私はそれをoutgoingStudentUserと同じ名前にすることができます。さて、これは私のコードです:「idDocumentsは」ドキュメントモデルの主キーをある

'outgoingStudentUser' => array(self::HAS_ONE, 'OutgoingStudent', array('idDocuments'=>'idOutgoingStudent'),'through'=>'declaration',), 

、およびidOutgoingStudentはOutgoingStudentのモデルの主キーです。

第2の関係は非常に類似した方法で修正することができます。

'Recrutation' => array(self::HAS_ONE, 'Recrutation', array('idDocuments'=>'idRecrutation'),'through'=>'declaration'), 

は「idDocumentsは」ドキュメントモデルの主キーであり、そしてidRecrutationはRecrutationのモデルの主キーです。

あなたは、これはここに正しい宣言であることを見つけることができます。http://www.yiiframework.com/doc/guide/1.1/en/database.arr#through-on-self

しかし、それがすべてではありません。私はあなたにもっと伝えたい!あなたのコードでやっていることは無意味です。 'with'は、関連するオブジェクトに熱心な読み込みを強制するために使用されます。次のコードでは:

$criteria->with = array('declaration','Recrutation','outgoingStudentUserIdUser'); 

あなたはちょうどあなたがDBにこの$基準を使用してドキュメントのインスタンスを取得するとき、それはまた、として渡された関係で、そのインスタンスにリンクされたモデルを取得することを$基準をで指定していますパラメータを 'with'に設定します。それは熱心なロードです。データベースへのクエリ数を減らすために使用されます。 "DBに行ってDocumentsのこのインスタンスを取得してください。しかし、そこにいたら、このオブジェクトに関連する他のテーブルのすべてのインスタンスごとに一度私を連れて来てください"というようなものです。

これはあなたが宣言していることですが、確かにそれはあなたがしたいことではありません。私の知り合いその宣言はsearch()関数の中では役に立たないからです。 http://www.yiiframework.com/doc/api/1.1/CDbCriteria/#with-detailのように、 'with'は一部の関数でのみ有効であり、search()はその1つではありません。検索の中で、熱心な読み込みは無意味で無意味で無駄です。

だから私はあなたに何をしようとしているのかと尋ねることを強いられました。あなたは言う:「私の目標は、ユーザー名と姓を使って文書を検索することです。また、Recrutation YearとSemesterを使って文書を検索することです」が、「ユーザー名と...を使って文書を検索する」とはどういう意味ですか?あなたは$ user-> documentsのように、$ userに関連するすべてのドキュメントを返すようにしますか?私はあなたがそれについてもっと具体的になるかもしれないことを望みますが、おそらくは別の、よりポイントに近い質問でもよいでしょう。

+0

感謝を!私が達成しようとしていた目標は、CGridViewのRecrutationsデータとOutgoing Studentsデータ(名前と姓)を検索して、ドキュメントを表示することでした(例えば、CGridViewでshowを実行すると、recrutation id 1に属し、ジョンスミス)。 search()で "with"を使用するというアイデアは私のものではありませんでした - 私はここでそれを見つけました:http://www.yiiframework.com/wiki/281/searching-and-sorting-by-related-model-in-cgridview/ – Pax0r

+0

ああなるほど!はい、それについての私のせいでした。今、あなたは私の提案を試しましたか?それは動作しましたか? –

+0

私は手作業でSQLを書いてきましたが、まだあなたのヒントを一般的に使っていますので、私はあなたの答えを受け入れています – Pax0r

0

また、これを試すことができます:あなたのコメントについて

return array(
      'declaration' => array(self::BELONGS_TO, 'Declaration', 'DeclarationID'), 
      'outgoingStudentUserIdUser' => array(self::HAS_ONE, 'OutgoingStudent', 'OutgoingStudent_User_idUser','through'=>'declaration',), 
      'Recrutation' => array(self::HAS_ONE, 'Recrutation', '', 'on'=>'declaration.id=Recrutation.Recrutation_RecrutationID'), 
); 
関連する問題