Activerecord 活动记录删除无效

Activerecord 活动记录删除无效,activerecord,yii,Activerecord,Yii,我尝试删除数据库中包含Yii活动记录的条目。但我觉得它真的很奇怪。 我想删除表中的所有记录,其中vehicle\u id=给定id,plug\u id不在(给定字符串) 我尝试了很多方法,除了这个,什么都没用 $query = "delete from `vehicle_details` where `vehicle_id`= ".$vehicle->id." AND `plug_id` NOT IN (".implode(',', array_map(function($item) {

我尝试删除数据库中包含Yii活动记录的条目。但我觉得它真的很奇怪。 我想删除表中的所有记录,其中vehicle\u id=给定id,plug\u id不在(给定字符串)

我尝试了很多方法,除了这个,什么都没用

$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))));
但是,如果我从这个查询中生成并按属性查找,它将运行良好并返回正确的数据


我希望你能给我解释一下

由于在方法中传递了错误的参数,因此代码无法工作。当YII尝试使用数组参数构建CDbCriteria对象时会出现问题。幸运的是,您可以自己构建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);

这就是您所需要的。

由于在方法中传递了错误的参数,您的代码无法工作。当YII尝试使用数组参数构建CDbCriteria对象时会出现问题。幸运的是,您可以自己构建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);
这就是你所需要的