Yii Framework - два отношения через одну и ту же "сквозную" таблицу - PullRequest
1 голос
/ 31 декабря 2011

Моя цель - иметь возможность искать документы по именам и фамилиям пользователей, а также по году и семестру рекрутинга.Документы имеют отношение только к декларациям таким образом, что документ связан с одной декларацией, а декларация может быть связана с одним или несколькими документами.

Объявления относятся к 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 () я хочусделать запрос -> с помощью

'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 t LEFT OUTER JOIN Declarations declaration ON (t. DeclarationID = declaration. idDeclarations) ВЛЕВО НАРУЖНОЕ СОЕДИНЕНИЕ Recrutation Recrutation ВКЛ (declaration. Recrutation_RecrutationID = Recrutation. RecrutationID) ВЛЕВО НАРУЖНОЕ СОЕДИНЕНИЕ Declarations declaration ВКЛ (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') нет ошибки только при использовании обоих.

Так что, вероятно, это должно быть сделано другим способом, но как?

Ответы [ 2 ]

2 голосов
/ 02 января 2012

У меня есть так много вещей, чтобы сказать вам!Вот они:

Я нахожу ваше объявление функции отношений довольно грязным, и я не уверен, что оно делает то, что вы хотите (если оно сработало).Вот мои предложения повторно объявить это:

Прежде всего, 'outgoingStudentUserIdUser' выглядит как ужасное имя для отношения.В конце концов, отношение будет к экземплярам outgoingStudentUser, а не только к «идентификаторам».Итак, позвольте мне назвать его так же, как 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');

в параметрах $ вы просто указываете, что при извлечении в БД экземпляра Document, использующего этот критерий $, он также извлекает модели, связанные с этим экземпляром отношениями.передается в качестве параметров для «с».Это нетерпеливая загрузка.Он используется для уменьшения количества запросов к базе данных.Это все равно что сказать: «иди в БД и принеси мне этот экземпляр Documents, но как только ты будешь там, принеси мне один раз для всех экземпляров других таблиц, связанных с этим объектом».

Ну, это то, что вы заявляете, но, конечно, это не то, что вы хотите сделать.Откуда я знаю?Потому что это объявление бесполезно внутри функции search ().Как вы можете видеть здесь: http://www.yiiframework.com/doc/api/1.1/CDbCriteria/#with-detail, 'with' полезен только в некоторых функциях, и search () не является одной из них.Внутренний поиск (), стремление к загрузке бессмысленно, бессмысленно и бесполезно.

Так что я вижу себя вынужденным спросить тебя, что ты пытаешься сделать?Вы говорите: «Моя цель - иметь возможность искать документы по именам и фамилиям пользователей, а также по году и семестру рекрутинга», но что вы подразумеваете под «поиском документов по именам пользователей и ...»?Хотите ли вы что-то вроде этого: $ user-> documents, чтобы вернуть все документы, связанные с $ user?Я надеюсь, что вы могли бы быть более конкретным в этом, но, возможно, в другом, более конкретном вопросе.

0 голосов
/ 21 апреля 2013

Вы также можете попробовать это:

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