本文实例讲述了Yii使用DeleteAll连表删除出现报错问题的解决方法。分享给大家供大家参考,具体如下:
删除数据的时候,经常会遇到连联判断删除数据的条件,今天用Yii 的CDbCriteria生成关连条件。批量删除的时候数据库报错。
页面代码为:
1
2
3
4
5
|
$criteria = new CDbCriteria;
$criteria ->join = ' LEFT JOIN {{positions}} p ON p.zpo_id=t.zpo_id ' ;
$criteria ->addCondition( "p.zpo_type=1" );
$criteria ->addCondition( "t.zpl_content_id in ($id)" );
PosLog::model()->deleteAll( $criteria );
|
错误SQL为:
复制代码 代码如下:
DELETE FROM `zd_pos_log` LEFT JOIN zd_positions p ON p.zpo_id=t.zpo_id WHERE (p.zpo_type=1) AND (t.zpl_content_id in (76))
正确SQL语句应为:
复制代码 代码如下:
DELETE t FROM `zd_pos_log` t LEFT JOIN zd_positions p ON p.zpo_id=t.zpo_id WHERE (p.zpo_type=1) AND (t.zpl_content_id in (76))
追溯到Yii 基类:
framework/db/schema/CDbCommandBuilder.php#166
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public function createDeleteCommand( $table , $criteria )
{
$this ->ensureTable( $table );
$sql = "DELETE FROM {$table->rawName}" ;
$sql = $this ->applyJoin( $sql , $criteria ->join);
$sql = $this ->applyCondition( $sql , $criteria ->condition);
$sql = $this ->applyGroup( $sql , $criteria ->group);
$sql = $this ->applyHaving( $sql , $criteria ->having);
$sql = $this ->applyOrder( $sql , $criteria ->order);
$sql = $this ->applyLimit( $sql , $criteria ->limit, $criteria ->offset);
$command = $this ->_connection->createCommand( $sql );
$this ->bindValues( $command , $criteria ->params);
return $command ;
}
|
解决方案。修改基类方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public function createDeleteCommand( $table , $criteria , $alias = 't' )
{
$this ->ensureTable( $table );
$alias = $this ->_schema->quoteTableName( $alias );
if ( empty ( $criteria ->join)){
$sql = "DELETE FROM {$table->rawName}" ;
} else {
$sql = "DELETE $alias FROM {$table->rawName} $alias" ;
}
$sql = $this ->applyJoin( $sql , $criteria ->join);
$sql = $this ->applyCondition( $sql , $criteria ->condition);
$sql = $this ->applyGroup( $sql , $criteria ->group);
$sql = $this ->applyHaving( $sql , $criteria ->having);
$sql = $this ->applyOrder( $sql , $criteria ->order);
$sql = $this ->applyLimit( $sql , $criteria ->limit, $criteria ->offset);
$command = $this ->_connection->createCommand( $sql );
$this ->bindValues( $command , $criteria ->params);
return $command ;
}
|
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。