Yii によって記録されないため、プロパティに null 値を割り当てても機能しません。プロパティの初期値は null であり、Yii は変更されたプロパティを追跡しません (これは少し面倒です)。
ここでの回避策は、次のように使用することです。
$productSearch = clone Product::model();
$productSearch->Category = array(null);
$products = $productSearch->search()->getData();
Category IS NULL OR Category IN (1, 2, 3)
より高度な方法で検索したい場合は、次の方法で検索することに注意してください。
$productSearch->Category = array(null, 1, 2, 3);
Yii はやみくもにすべてを 1 つの IN ステートメントに入れているため、うまくいきません。
Category IN (NULL, 1, 2, 3)
モデル検索メソッドに追加のコードが必要になるため、ここでの作業はより複雑になります。
public function search()
{
$criteria = new CDbCriteria;
// Work around of inability of Yii to handle IS NULL OR IN () conditions
if (is_array($this->Category) && count($this->Category) > 1)
{
$hasNull = false;
$values = array();
foreach ($this->Category as $value)
{
if (is_null($value))
{
$hasNull = true;
}
else
{
array_push($values, $value);
}
}
$condition = array();
if ($hasNull) array_push($condition, 'Category IS NULL');
if (count($values)) array_push($condition, "Category IN ('" . implode("', '", $values) . "')");
$criteria->addCondition(implode(' OR ', $condition));
}
else
{
$criteria->compare('Category', $this->Category);
}
// other search criterias ...
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}