【问题标题】:Yii CDBCriteria Complex Join QueryYii CDBCriteria 复杂连接查询
【发布时间】:2013-11-12 07:28:55
【问题描述】:

我有 3 张桌子:

  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_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]: Column not found: 1054 Unknown column 'b.bank_id' in 'on Clause'

任何帮助将不胜感激。

【问题讨论】:

    标签: php mysql sql yii


    【解决方案1】:

    您需要为您的表设置别名,如下所示: $criteria->alias='b'; 或使用默认别名“t”而不是“b”

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

    【讨论】:

    • 我都试过了,但都不起作用:CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 't.bank_id' in 'on clause'
    • 此错误消息表示未设置表别名。我刚刚尝试了这段代码$criteria = new 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 查询?
    【解决方案2】:

    试试:

    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 进行查询,则主表(在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
    

    【讨论】:

    • 像这样:$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'); 对吗?
    • 我正在用完整的解决方案更新答案,并且没有将主表的别名更改为b(没关系)。请记住:ActiveRecord 查询中的主表始终具有别名 t,但您可以根据需要更改它
    • 谢谢。我试过这个但同样的错误:(CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 't.bank_id' in 'on clause'
    • 现在显示:CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'name' in 'field list'
    • 好的,最后一次尝试:在select 中添加t.name(见答案)
    【解决方案3】:

    这里 $criteria->select = 'b.name'; 您只选择了银行名称,没有选择 id

    不确定 yii 格式之类的

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

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

    【讨论】:

    • 谢谢。实际上我有选择名称,因为我只想在管理网格视图上显示银行名称而不是 id。我也尝试了两种语法,但它不起作用。
    • 那么你应该从网格中隐藏id,而不是从sql查询@Ultimate
    • 好的。但条件也行不通。它显示了同样的错误
    【解决方案4】:

    正如@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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 2012-10-28
      • 2011-10-21
      • 2010-11-02
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多