分配空值的属性,因为它没有被Yii记录不起作用:属性初始值是零和的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);
韩元” t工作作为Yii一味地把它全部纳入一个单一的声明:
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,
));
}
问题的情景是默认值仍然分配给模型,意思是你有状态默认激活它将只搜索活动记录,但你没有意识到它。据我所知,无论选择哪种场景。 –
至于findAll我不喜欢暴露在控制器中的SQL,有点乱。 –
@AlexeiTenitski,$ productSearch-> unsetAttributes(); - 它也重置默认值,如果你想使用黑客,欢迎你。 – Sergey