您好,匿名用户
随意问技术百科期待您的加入

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

0 投票

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

默认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之外还有别的么?

用户头像 提问 2012年 12月1日 @ Cancer 上等兵 (211 威望)
分享到:

你的回答

隐私保护: 您的邮箱仅用于发送系统通知。
请输入验证码:
    图片验证码看不清?
登录注册后不会被要求输入验证码。

提一个问题:

相关问题

0 投票
1 回复 64 阅读
+1 投票
1 回复 122 阅读
用户头像 提问 2012年 12月1日 @ Taurus 上等兵 (303 威望)
0 投票
1 回复 152 阅读
用户头像 提问 2012年 12月1日 @ Sagittarius 上等兵 (289 威望)
0 投票
1 回复 36 阅读
用户头像 提问 2012年 12月1日 @ Gragas 上等兵 (254 威望)
0 投票
1 回复 13 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...