Heim >Backend-Entwicklung >PHP-Tutorial >Yii关联查询使用with无法生成正确sql的问题

Yii关联查询使用with无法生成正确sql的问题

WBOY
WBOYOriginal
2016-06-06 20:52:171073Durchsuche

最近在老家无法上网,这个问题一直都没有解决。

默认yii中ar查询是可以不使用with的,这样会使用延迟加载功能进行对象关联查询,很方便,但是带来了效率问题。

所以考虑使用with进行预加载,但是每当我使用with时就会出现sql错误,查看了error之后发现是因为relations里添加的order,condition,on等条件在生成最终的sql时不会自动加上表别名。

希望有了解的同学能提供一下解决办法。
--------------------------------------
这么说可能大家不太明白,我详细说明一下.

假设结构如下:

class CategoryModel{
  function relations() {
    return array(
        'description' => array(self::HAS_ONE,'CategoryDescription','category_id'),
    );
  }
  function defaultScope() {
    return array(
      'condition' => 'language=1',
      'order'     => 'created desc',
    );
  }
}
class CategoryDescriptionModel{
}
class SiteModel{
  function relations() {
    return array(
        'description' => array(self::HAS_ONE,'SiteDescription','site_id'),
        'category' => array(self::BELONGS_TO,'Category','category_id'),
    );
  }
  function defaultScope() {
    return array(
      'condition' => 'language=1',
      'order'     => 'created desc',
    );
  }

}
class SiteDescriptionModel{
}

那么当使用with的时候,created desc会出现歧义,比如.

Site::model()->count();
Site::model()->with('description')->findAll();
Site::model()->with('description','category','category.description');

上面后两个语句中的created desc就会成为语法错误,因为Yii进行了join之后会给表增加alias,所以没有alias的字段名无法识别.

之后我尝试和给所有的model定义alias,然后将scope中的order改为alias.created desc.但是产生了另一个问题,就是在count()的时候是没有Join操作的,所以alias.created desc也不识别而报错了.

官方文档中说scope中的字段要消除歧义,但是我没有找到一个完美的解决办法,除了定义alias之外还有别的么?

回复内容:

最近在老家无法上网,这个问题一直都没有解决。

默认yii中ar查询是可以不使用with的,这样会使用延迟加载功能进行对象关联查询,很方便,但是带来了效率问题。

所以考虑使用with进行预加载,但是每当我使用with时就会出现sql错误,查看了error之后发现是因为relations里添加的order,condition,on等条件在生成最终的sql时不会自动加上表别名。

希望有了解的同学能提供一下解决办法。
--------------------------------------
这么说可能大家不太明白,我详细说明一下.

假设结构如下:

class CategoryModel{
  function relations() {
    return array(
        'description' => array(self::HAS_ONE,'CategoryDescription','category_id'),
    );
  }
  function defaultScope() {
    return array(
      'condition' => 'language=1',
      'order'     => 'created desc',
    );
  }
}
class CategoryDescriptionModel{
}
class SiteModel{
  function relations() {
    return array(
        'description' => array(self::HAS_ONE,'SiteDescription','site_id'),
        'category' => array(self::BELONGS_TO,'Category','category_id'),
    );
  }
  function defaultScope() {
    return array(
      'condition' => 'language=1',
      'order'     => 'created desc',
    );
  }

}
class SiteDescriptionModel{
}

那么当使用with的时候,created desc会出现歧义,比如.

Site::model()->count();
Site::model()->with('description')->findAll();
Site::model()->with('description','category','category.description');

上面后两个语句中的created desc就会成为语法错误,因为Yii进行了join之后会给表增加alias,所以没有alias的字段名无法识别.

之后我尝试和给所有的model定义alias,然后将scope中的order改为alias.created desc.但是产生了另一个问题,就是在count()的时候是没有Join操作的,所以alias.created desc也不识别而报错了.

官方文档中说scope中的字段要消除歧义,但是我没有找到一个完美的解决办法,除了定义alias之外还有别的么?

要用$criteria = new CDbCriteria(); 才可以完美解决

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn