Yii - activeRecord - 添加一个自动orderby子句

时间:2014-11-18 16:22:28

标签: activerecord yii

我尝试找出为什么以及在我使用(CDCriteria)时添加了“orderBy”子句但在互联网上没有任何内容,并且无法在代码中找到..

我有3个表定义地点类型(id,每个名称): 分类>活动>专业

我有桌位:

id |名字| place_type_id | place_type_spe_id

我在Place模型中有几个已定义的关系:

public function relations() {
    return array(

        'placeType' => array(self::BELONGS_TO, 'PlaceType', 'place_type_id'),
        'placeTypeSpecialty' => array(self::BELONGS_TO, 'PlaceTypeSpecialty', 'place_type_specialty_id'),           
    );
}

PlaceType(actiivty)模型中定义的关系:

  public function relations() {
    return array(           
        'places' => array(self::MANY_MANY, 'Place', 'place_secondary_type(place_type_id, place_id)'),
        'placeTypeCategory' => array(self::BELONGS_TO, 'PlaceTypeCategory', 'place_type_category_id'),
        'placeTypeSpecialties' => array(self::HAS_MANY, 'PlaceTypeSpecialty', 'place_type_id'),
    );

我想在地名,相对活动名称,相对专业名称和相关类别名称(取决于活动......)中搜索关键字。

我试过了:

        $criteria = new CDbCriteria();
    $criteria->with = array('placeType', 'placeType.placeTypeSpecialties', 'placeType.placeTypeCategory');
    $criteria->together = true;


    $words = StringHelper::parseKeywords($keywords);


    $keywordsCriteria = new CDbCriteria();
    foreach ($words as $w) {
        $wordCriteria = new CDbCriteria();

        $wordCriteria->compare('t.name', $w, true, 'OR');
        $wordCriteria->compare('placeTypeCategory.name', $w, true, 'OR');
        $wordCriteria->compare('placeTypeCategory.expression', $w, true, 'OR');
        $wordCriteria->compare('placeType.name', $w, true, 'OR');
        $wordCriteria->compare('placeType.common_words', $w, true, 'OR');
        $wordCriteria->compare('placeTypeSpecialties.name', $w, true, 'OR');
        $keywordsCriteria->mergeWith($wordCriteria, 'OR');
    }

    $criteria->mergeWith($keywordsCriteria);

    $this->getDbCriteria()->mergeWith($criteria);
    return $this;

但是......由于以下原因导致SQL查询失败:

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'name' in order clause is ambiguous.

ORDER BY子句是:

ORDER BY distance ASC, placeType.name ASC, name ASC
“name”显然很暧昧,但我不想在这个领域订购!添加$criteria->with = array('placeType.placeTypeCategory');会按顺序添加此订单..

我的问题是:

为什么要添加它以及如何忽略它.. 感谢

1 个答案:

答案 0 :(得分:0)

我发现了问题。

上一个开发者在PlaceTypeCategory模型中添加了defaultScope函数:

    public function defaultScope()
{
  return array(
    'order' => 'name ASC'
  );
}

我不知道这种可能性。