1

私の目標は、ユーザー名と名前、および採用年と学期を介してドキュメントを検索できるようにすることです。ドキュメントは、ドキュメントが正確に1つの宣言に接続され、宣言が正確に1つのドキュメントに接続されるか、まったく接続されないように、宣言にのみ関連付けられます。

宣言は、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'),
                );

そして今、search()関数でクエリを実行したい->

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

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

このエラーが発生します:

CDbCommandniezdołałwykonaćinstrukcjiSQL:SQLSTATE [42000] [1066]一意ではないテーブル/エイリアス:'宣言'。実行されたSQLステートメントは次のとおりです。SELECTCOUNT(DISTINCT tDeclarationID)FROM Documents tLEFT OUTER JOIN Declarations declarationON(tDeclarationID= declarationidDeclarations)LEFT OUTER JOIN Recrutation RecrutationON(declarationRecrutation_RecrutationID= RecrutationRecrutationID)LEFT OUTER JOIN Declarations declarationON(tDeclarationID= declarationidDeclarations)LEFT OUTER JOIN OutgoingStudent outgoingStudentUserIdUserON(declarationOutgoingStudent_User_idUser= outgoingStudentUserIdUserUser_idUser

のみを使用する場合、$criteria->with = array('declaration','Recrutation')または$criteria->with = array('declaration','outgoingStudentUserIdUser')両方を使用する場合のみエラーは発生しません。

おそらくそれは他の方法で行われるべきですが、どうやって?

4

2 に答える 2

2

お伝えしたいことがたくさんあります!どうぞ:

私はあなたのリレーション関数の宣言がかなり面倒だと思います.それがあなたがしたいことをしているかどうかはわかりません. これを再宣言するための私の提案は次のとおりです。

まず、'outgoingStudentUserIdUser' はリレーションのひどい名前のように見えます。最終的に、リレーションは「ID」だけでなく、outgoingStudentUser のインスタンスにもなります。だから、私はそれを「outgoingStudentUser」と名付けさせてください。今、これは私のコードです:

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

ここで、「idDocuments」は Documents のモデルの主キーであり、idOutgoingStudent は OutgoingStudent のモデルの主キーです。

2 番目の関係は、非常によく似た方法で修正できます。

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

ここで、「idDocuments」は Documents のモデルの主キーであり、idRecrutation は Recrutation のモデルの主キーです。

これが正しい宣言であることがわかります: http://www.yiiframework.com/doc/guide/1.1/en/database.arr#through-on-self

しかし、それだけではありません。もっと言いたいことがあります!コードで行っていることは無意味です。'with' は、関連するオブジェクトを積極的にロードするために使用されます。次のコードでは:

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

$criteria で、この $criteria を使用してドキュメントのインスタンスを DB で取得するときに、'with' にパラメータとして渡された関係によってそのインスタンスにリンクされたモデルもフェッチすることを指定しているだけです。それが熱心な読み込みです。データベースへのクエリ数を減らすために使用されます。「DB に行って Documents のこのインスタンスを取得しますが、そこに着いたら、このオブジェクトに関連する他のテーブルのすべてのインスタンスを 1 回ずつ取得してください」と言っているようなものです。

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

それで、あなたは何をしようとしているのですか?「私の目標は、ユーザーの名前と姓、および採用年と学期を介してドキュメントを検索できるようにすることです」とあなたは言いますが、「ユーザー名と...を介してドキュメントを検索する」とはどういう意味ですか? $user->documents のようにして、$user に関連付けられたすべてのドキュメントを返しますか? それについてもっと具体的に教えていただければ幸いですが、おそらく別の、より的確な質問で。

于 2012-01-01T22:52:49.973 に答える
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'),
);
于 2013-04-20T21:12:02.903 に答える