Yii框架 - 通过相同的两个关系"通过"表

时间:2011-12-31 13:10:40

标签: php mysql yii yii-relations

我的目标是有可能通过用户名和姓氏以及通过重生年和学期搜索文档。 文件仅与声明相关,文件与一个宣言和声明相关联,可以与一个或几个文件连接。

声明与OutgoingStudent和Recrutation有关。

因此,在查询文档时,我想通过声明表查询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()函数中我想进行查询 - > with

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

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

我收到了这个错误:

  

CDbCommandniezdołałwykonaćinstrukcjiSQL:SQLSTATE [42000] [1066]   不唯一的表/别名:'声明'。执行的SQL语句是:   SELECT COUNT(DISTINCT tDeclarationID)FROM Documents t LEFT   外部加入Declarations declaration开启   (tDeclarationID = declarationidDeclarations)LEFT OUTER JOIN   Recrutation Recrutation ON   (declarationRecrutation_RecrutationID = RecrutationRecrutationID)   LEFT OUTER JOIN Declarations declaration ON   (tDeclarationID = declarationidDeclarations)LEFT OUTER JOIN   OutgoingStudent outgoingStudentUserIdUser ON   (declarationOutgoingStudent_User_idUser = outgoingStudentUserIdUserUser_idUser

仅使用$criteria->with = array('declaration','Recrutation')$criteria->with = array('declaration','outgoingStudentUserIdUser')时,仅在使用两者时才会出错。

所以可能应该以其他方式完成,但是如何?

2 个答案:

答案 0 :(得分:2)

我有很多事要告诉你!他们在这里:

我发现你的关系函数声明非常混乱,我不确定它是否正在做你想做的事情(如果它有效)。以下是我重新声明它的建议:

首先,'outgoingStudentUserIdUser'看起来像一个关系的可怕名字。最后,关系将是outgoingStudentUser的实例,而不仅仅是'ids'。所以请允许我将其命名为outgoingStudentUser。现在,这是我的代码:

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

其中'idDocuments'是Documents的模型主键,idOutgoingStudent是OutgoingStudent的模型主键。

第二种关系可以用非常类似的方式纠正:

 '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中指定当您使用此$条件在DB中检索Documents实例时,它还将通过作为参数传递给“with”的关系获取链接到该实例的模型。这是急切的加载。它用于减少对数据库的查询次数。就像说:“转到DB并获取这个文档实例,但是一旦你在那里,每个与该对象相关的其他表的所有实例都会给我一次”。

嗯,这就是你宣布的,但肯定不是你想要做的。我怎么知道?因为该声明在search()函数中是无用的。正如您在此处看到的那样:http://www.yiiframework.com/doc/api/1.1/CDbCriteria/#with-detail,'with'仅在某些函数中有用,而search()不是其中之一。在搜索()中,急切的加载是毫无意义的,没有意义和无用的。

所以我看到自己被迫问你想做什么?你说:“我的目标是有可能通过用户名和姓氏搜索文档,也可以通过Recrutation Year and Semester”,但你的意思是“通过用户名搜索文件和......”?你想要这样的东西:$ user-> documents,返回与$ user相关的所有文件?我希望你能更具体地说明这一点,但也许是另一个更重要的问题。

答案 1 :(得分: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'),
);