3

Category プロパティを持つ Product モデルがあり、 search() 関数を使用してカテゴリが null であるすべての製品を取得したいとします。

$productSearch = clone Product::model();
$productSearch->Category = null;

$products = $productSearch->search()->getData();

生成された SQL を調べると、機能しないことがわかります。カテゴリはクエリでまったく言及されていません。それを行う最良の方法は何ですか?

また、特定のプロパティがNULL または特定の値に設定されているレコードを検索する方法

4

2 に答える 2

5

最初のバリアント:

// use search scenario, not clone model with metadata
$productSearch = new Product('search'); 
$productSearch->unsetAttributes();

// get CActiveDataProvider
$dataProvider = $productSearch->search();
// Add null condition
$dataProvider->criteria->addCondition('Category is null');
// Get data - first 10 rows
$products = $dataProvider->getData();

2 番目のバリアント (推奨):

$products = Product::model()->findAll('Category is null');
于 2012-10-10T04:58:56.023 に答える
0

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

}
于 2012-10-09T21:53:11.467 に答える