0

我有 3 张桌子:

  1. 银行
  2. 银行明细
  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_details模型的管理视图中获取银行详细信息,例如 bank_name、ifsc 等信息。

我生成的正常 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]:找不到列:1054 'on 子句'中的未知列 'b.bank_id'

任何帮助,将不胜感激。

4

4 回答 4

1

您需要像这样为您的表设置别名: $criteria->alias='b';或使用默认别名“t”而不是“b”

在http://www.yiiframework.com/doc/api/1.1/CDbCriteria#alias-detail阅读更多内容

于 2013-11-12T08:18:55.560 回答
1

尝试:

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,
        ),
    ));
}

主表(在 FROM 中)有别名t,在compare你已经有了一些条件之后,你需要添加到现有的,而不是重写

更新

如果您从模型中查询,bank_details则主表 (in 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
于 2013-11-12T08:19:58.023 回答
0

此处 $criteria->select = 'b.name'; 您仅选择银行名称,未选择任何 ID

不确定 yii 格式之类的

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

或者

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

于 2013-11-12T07:32:31.617 回答
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

于 2013-11-12T08:41:27.020 回答