[英]Yii CDBCriteria Complex Join Query
I have 3 tables: 我有3张桌子:
Relation between them: 它们之间的关系:
bank model: 银行模式:
public function relations() {
return array(
'bankBankDetails' => array(self::HAS_MANY, 'BankBankDetails', 'bank_id'),
);
}
bank_details model: bank_details模型:
public function relations() {
return array(
'bankBankDetails' => array(self::HAS_MANY, 'BankBankDetails', 'bank_details_id'),
);
}
bank_bank_details model: 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'),
);
}
I want to fetch bank details like bank_name, ifsc etc info in admin view of bank_details model. 我想在bank_details模型的管理视图中获取银行详细信息,如bank_name,ifsc etc info。
The normal SQL query I have generated which works perfectly fine: 我生成的普通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
Now I just wants to integrate this with Yii CDBCriteria but its not working for me. 现在我只想将它与Yii CDBCriteria集成,但它不适用于我。 Please check the code below:
请检查以下代码:
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,
),
));
}
Error: Error 500 Found CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'b.bank_id' in 'on clause' 错误: 发现错误500 CDbCommand无法执行SQL语句:SQLSTATE [42S22]:找不到列:1054'on子句'中的未知列'b.bank_id'
Any help would be appreciated. 任何帮助,将不胜感激。
You need to set alias to your table like this: $criteria->alias='b';
你需要像这样设置表的别名:
$criteria->alias='b';
or use default alias "t" instead of "b" 或使用默认别名“t”而不是“b”
read more at http://www.yiiframework.com/doc/api/1.1/CDbCriteria#alias-detail 欲了解更多信息, 请访问http://www.yiiframework.com/doc/api/1.1/CDbCriteria#alias-detail
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,
),
));
}
Main table (which is in FROM) has alias t
and after compare
you already having some condition, than you need to add to existing, not rewrite 主表(在FROM中)具有别名
t
并且在compare
之后您已经具有某些条件,而不是您需要添加到现有的,而不是重写
UPDATE UPDATE
If you do query from model bank_details
then the main table (in FROM
) must be bank_details
. 如果从模型
bank_details
进行查询,那么主表(在FROM
)必须是bank_details
。 Query will be: 查询将是:
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
here $criteria->select = 'b.name';
这里
$criteria->select = 'b.name';
You are selecting only bank name and no id is selected 您只选择银行名称,但未选择任何ID
Not sure with the yii format something like 不确定yii格式是什么样的
$criteria->select = 'b.name,b.bank_id';
or 要么
$criteria->select = array('b.name,b.bank_id');
As @Evgeniy mentioned, you will need to set the alias using $criteria->alias = 'b';
正如@Evgeniy所提到的,你需要使用
$criteria->alias = 'b';
来设置别名$criteria->alias = 'b';
http://www.yiiframework.com/doc/api/1.1/CDbCriteria#alias-detail http://www.yiiframework.com/doc/api/1.1/CDbCriteria#alias-detail
You might also want to look into using CDbCriteria::with
you can use this to select related models. 您可能还想查看使用
CDbCriteria::with
您可以使用它来选择相关模型。
http://www.yiiframework.com/doc/api/1.1/CDbCriteria#with-detail http://www.yiiframework.com/doc/api/1.1/CDbCriteria#with-detail
If you use the above, make sure you also use CDbCriteria::together
correctly. 如果您使用上述内容,请确保您还正确使用
CDbCriteria::together
。 To select all related models at once, set it to true
; 要一次选择所有相关模型,请将其设置为
true
;
http://www.yiiframework.com/doc/api/1.1/CDbCriteria#together-detail http://www.yiiframework.com/doc/api/1.1/CDbCriteria#together-detail
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.