这里我使用Yii2来开发应用程序。它与Yii1略有不同。在开发过程中,我只是坚持我需要一个区域的删除功能。
要删除DB
中的某些行,我使用deleteAll()方法,如下所示:
Model::deleteAll(['not in', '<attribute_1>', $attribute_1_values_array]);
这对我来说很好。但是现在我想在这个删除函数中添加另一个条件,如:
<attribute_2>=<attribute_2_value>
我知道我们可以使用where()
添加条件delete()
,然后我尝试使用此deleteAll()
方法。但它不支持。
在这里,我需要在同一查询中结合not in
条件和equal to
条件。
任何帮助将不胜感激。
答案 0 :(得分:4)
这是我通常如何做到这一点:
\common\models\Record::deleteAll([
'AND', 'status = :attribute_2', [
'NOT IN', 'id',
[1, 2]
]
], [
':attribute_2' => 'new'
]);
结果是:
DELETE FROM `record` WHERE (status = 'new') AND (`id` NOT IN (1, 2))
答案 1 :(得分:2)
您可以从[]
功能中移除deleteAll()
括号,并使用此类功能。
Model::deleteAll('attribute_1 NOT IN :attr_1_value AND attribute_2 = :attr_2_value', ['attr_1_value'=>$attribute_1_values_array,':attr_2_value'=>$attribute_2_value]);
OR
Model::deleteAll('attribute_1 NOT IN '.$attribute_1_values_array.' AND attribute_2 = '.$attribute_2_value);
删除[]
将允许添加标准/自定义query
。
答案 2 :(得分:1)
您可以删除以下所有记录:
Model::deleteAll(
['AND',
['NOT',['attribute_1'=>$attribute_1_values_array]], // array i.e [1,2]
['attribute_2'=> $attribute_2_value ]
]
);
紧凑的方式:
$condition = ['AND',
['NOT',['attribute_1'=>$attribute_1_values_array]],
['attribute_2'=> $attribute_2_value ]
];
Model::deleteAll($condition);