1

我的目标是有可能通过用户姓名和姓氏以及招聘年份和学期来搜索文档。文档仅与声明相关,文档与一个声明相关联,而声明可以与一个或无文档相关联。

声明与 OutgoingStudent 和 Recrucation 有关。

因此,当查询文档时,我还想通过声明表查询 OutgoingStudent 和 Recruations。

我在文档中的关系代码:

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');

我收到此错误:

CDbCommand nie zdołał wykonać instrukcji SQL:SQLSTATE[42000] [1066] 不是唯一的表/别名:“声明”。执行的 SQL 语句为: SELECT COUNT(DISTINCT t. DeclarationID) FROM Documents tLEFT OUTER JOIN Declarations declarationON ( t. DeclarationID= declaration. idDeclarations) LEFT OUTER JOIN Recrutation RecrutationON ( declaration. Recrutation_RecrutationID= Recrutation. RecrutationID) LEFT OUTER JOIN Declarations declarationON ( t. DeclarationID= declaration. idDeclarations) LEFT OUTER JOIN OutgoingStudent outgoingStudentUserIdUserON ( declaration. OutgoingStudent_User_idUser= outgoingStudentUserIdUser. User_idUser)

仅使用时$criteria->with = array('declaration','Recrutation')$criteria->with = array('declaration','outgoingStudentUserIdUser')仅使用两者时都没有错误。

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

4

2 回答 2

2

我有很多话要告诉你!他们来了:

我发现您的关系函数声明非常混乱,而且我不确定它是否在做您想要做的事情(以防它起作用)。以下是我重新声明它的建议:

首先,'outgoingStudentUserIdUser' 看起来像是一个糟糕的关系名称。最后,该关系将与传出StudentUser 的实例有关,而不仅仅是与“ids”。因此,请允许我将其命名为传出学生用户。现在,这是我的代码:

  '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 是 Recruutation 的模型主键。

您可以在这里找到正确的声明:http ://www.yiiframework.com/doc/guide/1.1/en/database.arr#through-on-self

但这还不是全部。我还有更多话要告诉你!你用你的代码做什么是没有意义的。'with' 用于强制加载相关对象。在以下代码中:

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

您只是在 $criteria 中指定,当您使用此 $criteria 在数据库中检索文档实例时,它还将通过作为参数传递给“with”的关系获取链接到该实例的模型。那是急切的加载。它用于减少对数据库的查询次数。就像在说:“去 DB 给我这个 Documents 实例,但是一旦你到了那里,就把与这个对象相关的其他表的所有实例都带给我一次”。

好吧,这就是您要声明的内容,但肯定不是您想要做的。我怎么知道?因为该声明在 search() 函数中是无用的。正如您在此处看到的:http ://www.yiiframework.com/doc/api/1.1/CDbCriteria/#with-detail ,'with' 仅在某些功能中有用,而 search() 不是其中之一。在 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 回答