2013-11-12 3 views
0

У меня есть 3 таблицы:Yii CDbCriteria комплекс Регистрация запроса

1) банк 2) bank_details 3) bank_bank_details

связь между ними:

банк модель:

public function relations() { 
     return array(
      'bankBankDetails' => array(self::HAS_MANY, 'BankBankDetails', 'bank_id'), 
     ); 
} 

bank_details модель:

public function relations() { 
     return array(
      'bankBankDetails' => array(self::HAS_MANY, 'BankBankDetails', 'bank_details_id'), 
     ); 
    } 

bank_bank_details модель:

public function relations() 
    { 
     return array(
      'bank' => array(self::BELONGS_TO, 'Bank', 'bank_id'),    
      'bankDetails' => array(self::BELONGS_TO, 'BankDetails', 'bank_details_id'), 
     ); 
    } 

Я хочу получать банковские реквизиты, как BANK_NAME, IFSC и т.д. Информация в виде админки bank_details модели.

нормальный SQL-запрос я генерироваться, который отлично работает:

SELECT b.name 
FROM bank b 
LEFT JOIN bank_bank_details bbd ON bbd.bank_id = b.bank_id 
LEFT JOIN bank_details bd ON bd.bank_details_id = bbd.bank_details_id 
WHERE bd.bank_details_id = bbd.bank_details_id 
LIMIT 0 , 30 

Теперь я просто хочет интегрировать это с Yii CDbCriteria, но он не работает для меня. Пожалуйста, проверьте код ниже:

public function search() { 
     $criteria = new CDbCriteria;  
//  select b.name 
//  from bank b 
//  left join bank_bank_details bbd 
//  on bbd.bank_id = b.bank_id 
//  left join bank_details bd on bd.bank_details_id = bbd.bank_details_id 
//  WHERE bd.bank_details_id = bbd . bank_details_id; 

     $criteria->compare('bank_details_id', $this->bank_details_id); 
     $criteria->compare('first_holder_name', $this->first_holder_name, true); 
     $criteria->compare('nominee1', $this->nominee1, true); 
     $criteria->select = 'b.name'; 
     $criteria->join = 'LEFT JOIN bank_bank_details bbd ON bbd.bank_id = b.bank_id '; 
     $criteria->join .= 'LEFT JOIN bank_details bd ON bd.bank_details_id = bbd.bank_details_id'; 
     $criteria->condition = 'bd.bank_details_id = bbd.bank_details_id'; 

     return new CActiveDataProvider($this, array(
      'criteria' => $criteria, 
      'pagination' => array(
       'pageSize' => 10, 
      ), 
     )); 
    } 

Ошибка: Ошибка 500 Найдено CDbCommand не удалось выполнить SQL заявление: SQLSTATE [42S22]: Column не найдено: 1054 Неизвестный столбец 'b.bank_id' в " по статье «

Любая помощь будет оценена по достоинству.

ответ

0

здесь $criteria->select = 'b.name'; Вы выбираете только название банка и не идентификатор не выбран

Не уверен в формате юй что-то вроде

$criteria->select = 'b.name,b.bank_id';

или

$criteria->select = array('b.name,b.bank_id');

+0

Спасибо. На самом деле у меня есть выбранное имя, потому что я хочу только отображать имя банка в виде сетки администратора, а не идентификатор. Также я попробовал и синтаксис, но не работал. – Sky

+0

, тогда вы должны скрыть идентификатор из сетки, а не из SQL-запроса @Ultimate – coolguy

+0

Хорошо. Но условие также не работает. Он показывает мне ту же ошибку – Sky

1

Тебе нужно установить псевдоним в таблицу, как это: $criteria->alias='b'; или использовать псевдоним по умолчанию «т» вместо «Ъ»

читать далее на http://www.yiiframework.com/doc/api/1.1/CDbCriteria#alias-detail

+0

Я пробовал оба, но не работал: 'CDbCommand не смог выполнить инструкцию SQL: SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 't.bank_id' в 'on clause'' – Sky

+0

Это сообщение об ошибке говорит, что псевдоним таблицы не задан. Я просто пробовал этот код '$ критерии = новый CDbCriteria; $ criteria-> select = 'b.name'; $ criteria-> alias = 'b'; $ criteria-> join = 'LEFT JOIN bank_bank_details bbd ON bbd.bank_id = b.bank_id'; $ criteria-> join. = 'LEFT JOIN bank_details bd ON bd.bank_details_id = bbd.bank_details_id'; $ criteria-> condition = 'bd.bank_details_id = bbd.bank_details_id'; ... ' и он работает. У вас есть запрос sql, который вызывает вашу ошибку, в журналах? – Evgeniy

1

Try:

public function search() { 
    $criteria = new CDbCriteria;  
    $criteria->compare('bank_details_id', $this->bank_details_id); 
    $criteria->compare('first_holder_name', $this->first_holder_name, true); 
    $criteria->compare('nominee1', $this->nominee1, true); 
    $criteria->select = 'bank.name'; 
    $criteria->with = array(
     'bankBankDetails' => array('joinType'=>'LEFT JOIN'), 
     'bankBankDetails.bank' => array('joinType'=>'LEFT JOIN'), 
    ); 
    $criteria->addCondition('t.bank_details_id = bankBankDetails.bank_details_id'); 

    return new CActiveDataProvider($this, array(
     'criteria' => $criteria, 
     'pagination' => array(
      'pageSize' => 10, 
     ), 
    )); 
} 

Главная таблица (которая in FROM) имеет псевдоним t и после compare у вас уже есть какое-то условие, которое вам нужно добавить в существующее, а не переписывать

UPDATE

Если запрос от модели bank_details затем основной таблицы (в FROM) должен быть bank_details. Запрос будет:

SELECT b.name 
FROM bank_details bd 
LEFT JOIN bank_bank_details bbd ON bd.bank_details_id = bbd.bank_details_id 
LEFT JOIN bank b bbd ON bbd.bank_id = b.bank_id 
WHERE bd.bank_details_id = bbd.bank_details_id 
LIMIT 0 , 30 
+0

Например: '$ criteria-> select = 'b.name'; $ criteria-> alias = 'bank t'; $ criteria-> join = 'LEFT JOIN bank_bank_details bbd ON bbd.bank_id = t.bank_id'; $ criteria-> join. = 'LEFT JOIN bank_details bd ON bd.bank_details_id = bbd.bank_details_id'; $ criteria-> addCondition ('bd.bank_details_id = bbd.bank_details_id'); 'правильно? – Sky

+0

Я обновляю ответ с полным решением и не изменяя псевдоним основной таблицы на 'b' (это не имеет значения). Просто помните: главная таблица в запросах ActiveRecord всегда имеет псевдоним 't', но вы можете изменить его, если хотите – CreatoR

+0

Спасибо. Я пробовал эту, но такую ​​же ошибку :('CDbCommand не смог выполнить инструкцию SQL: SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец« t.bank_id »в разделе« on » – Sky

0

Как уже упоминалось @Evgeniy, вам нужно будет установить псевдоним, используя $criteria->alias = 'b';

http://www.yiiframework.com/doc/api/1.1/CDbCriteria#alias-detail

Вы также можете посмотреть в использовании CDbCriteria::with вы можете использовать эту функцию, чтобы выбрать родственный моделей.

http://www.yiiframework.com/doc/api/1.1/CDbCriteria#with-detail

Если вы используете выше, убедитесь, что вы также можете использовать CDbCriteria::together правильно. Чтобы сразу выбрать все связанные модели, установите его на true;

http://www.yiiframework.com/doc/api/1.1/CDbCriteria#together-detail

Смежные вопросы