我尝试使用Yii的活动记录删除数据库中的条目。但我觉得这很奇怪。 我想删除我的表的所有记录,其中vehicle_id =给定的id和plug_id NOT IN(给定字符串)
我尝试了很多方法但没有任何效果,但是这个
$query = "delete from `vehicle_details` where `vehicle_id`= ".$vehicle->id." AND `plug_id` NOT IN (".implode(',', array_map(function($item) {
return $item->type;
}, $vehicleDetails->plug)).")";
$command = Yii::app()->db->createCommand($query);
$command->execute();
但为什么这不起作用?
VehicleDetail::model()->DeleteAllByAttributes(
array('vehicle_id' => $vehicle->id),
array('condition' => 'plug_id NOT IN (:ids)',
'params' => array('ids' => implode(',', array_map(function($item) {
return $item->type;
}, $vehicleDetails->plug)))));
或者这个:
VehicleDetail::model()->deleteAll(' vehicle_id = :vehicleId AND plug_id NOT IN (:ids)', array('vehicleId' => $vehicle->id, 'ids' => implode(',', array_map(function($item) {
return $item->type;
}, $vehicleDetails->plug))));
但是,如果我通过此查询创建和查找属性,它可以正常工作并返回正确的数据。
我希望你能解释一下。
答案 0 :(得分:4)
由于方法中传递了错误的参数,您的代码无效。当YII尝试使用您的数组参数构建CDbCriteria对象时出现问题。 Fortunetly,您可以自己构建CDbCriteria并直接将其传递给方法。在这种特殊情况下,可以更容易地使用CDbCriteria对象来解决问题。
$dbc = new CDbcriteria();
$dbc->condition = 'vehicle_id = :vehicleId';
$dbc->params = array(':vehicleId'=>$vehicle->id);
$dbc->addNotInCondition(
'plug_id',
array_map(
function($item) {
return $item->type;
},
$vehicleDetails->plug)
);
VehicleDetail::model()->deleteAll($dbc);
这就是你所需要的一切。