0

CGridViewの関連モデルによる検索と並べ替えに関する包括的な記事がここにあります:http ://www.yiiframework.com/wiki/281/searching-and-sorting-by-related-model-in-cgridview/ 私は成功しましたこのレシピを何度も実装しました。

ただし、現在、同じテーブル(parent_idを定義している)にあるリレーションで検索およびソートしようとしています。以下の「親」関係を参照してください。

public function relations()
{
    return array(
        'parent' => array(self::BELONGS_TO, 'Category', 'parent_id'),
        'children' => array(self::HAS_MANY, 'Category', 'parent_id'),
        'childCount' => array(self::STAT, 'Category', 'parent_id'),
        'author0' => array(self::BELONGS_TO, 'User', 'author'),
        'contents' => array(self::MANY_MANY, 'Content', 'content_category(content_id, category_id)'),
        'crsContents' => array(self::MANY_MANY, 'ContentCrs', 'content_category(content_id, category_id)'),
    );
}

public function defaultScope()
{
    return array(
        'alias'=>'cat',
        'order'=>"cat.name ASC",
    );
}

wikiで指定されているようにメソッドを実装すると、次のエラーが発生します。

CDbCommand failed to execute the SQL statement: SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'cat'. The SQL statement executed was: SELECT COUNT(DISTINCT `cat`.`id`) FROM `category` `cat` LEFT OUTER JOIN `category` `cat` ON (`cat`.`parent_id`=`cat`.`id`) WHERE (cat.parent_id <> 257)

LEFT OUTER JOINがリレーションなどの一意のテーブルエイリアスを使用していることを確認して、 inparentを適切に定義できるようにするにはどうすればよいですか。CDbCriteriasearch()

編集

@tereškoからのリクエストに応じて、これが私のsearch()関数です。定義していないときに指定されたテーブルエイリアスが原因で欠陥があることはわかってparentいます...方法がわかりません!

public function search()
{
    $criteria=new CDbCriteria;
    $criteria->with = array('parent');

    $criteria->compare('id',$this->id,true);
    $criteria->compare('author',$this->author,true);
    $criteria->compare('name',$this->name,true);
    $criteria->compare('description',$this->description,true);
    $criteria->compare('parent_id',$this->parent_id,true);
    $criteria->compare('parent.name', $this->parent_search, true );
    $criteria->compare('type',$this->type,true);
    $criteria->compare('slug',$this->slug,true);
    $criteria->compare('created',$this->created,true);
    $criteria->compare('updated',$this->updated,true);

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
            'sort'=>array(
                'attributes'=>array(
                    'parent_search'=>array(
                        'asc'=>'parent.name',
                        'desc'=>'parent.name DESC',
                    ),
                    '*',
                ),
            ),
        )
    );
}
4

1 に答える 1

2

以下のように親関係にエイリアスを与えることができます

$criteria->with = array(
   'parent'=>array(
      'alias'=>'parent'
    )
);      
于 2012-11-04T17:05:41.290 に答える