2

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))));

しかし、このクエリから属性を作成して検索すると、うまく機能し、正しいデータが返されます。

説明していただければ幸いです。

4

1 に答える 1

4

メソッドで渡された引数が間違っているため、コードが機能しません。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);

必要なのはそれだけです。

于 2013-07-01T20:34:35.027 に答える