2015-06-18 22:39:31 12762次浏览 8条回答 2 悬赏 0 金钱

新手求助!!!

使用crud后生成,其中class表类关联查询area表

class表类的search函数中
$query = AClass::find();
$query->joinWith("area");
出现了错误,报错为:where字句中,名为id的字段冲突(class表中和area表中都有名为id的字段)

The SQL being executed was: SELECT COUNT(*) FROM `class` LEFT JOIN `area` ON `class`.`areaid` = `area`.`id` WHERE (`id`='1') AND (`areaid`='6')

请问怎么解决这个问题啊?

  • 回答于 2015-06-19 09:49 举报

    这个貌似relation相关函数里要写好

  • 回答于 2015-06-19 13:27 举报

    如果有重名的字段在条件中要带上表名,比如$query->andWhere([AClass::tableName().'.id' => 1])

    觉得很赞
  • 回答于 2015-06-24 19:44 举报

    $query->from('user u');
    这样给user表起个别名u。

  • 回答于 2015-06-29 18:30 举报

    楼上正解 $query->from(User::tableName() . ' u1');

  • 回答于 2016-05-11 21:36 举报

    可以使用 from() 方法覆盖。

    $query = Studio::find ();
    $query->select('s.*,r.name as pname');
    $query->from(Studio::tableName() . ' as s');
    $query->leftJoin(Region::tableName() . ' as r' , ' r.id = s.province_id');
    
    1 条回复
    回复于 2016-05-11 21:42 回复

    如果是这种写法,看起来是 第一行是 可以省略。实际上,如果省略了,那么在视图页面 会 没有 $model 这个变量的。

    还有个方法,是在模型类里写

    public function getType()
        {
            return $this->hasOne(Type::className(), ['id' => 'type_id']);
        }
    
  • 回答于 2017-01-12 17:52 举报
    $query = Brand::find()->alias('b');
    $query = $query->joinWith("createdUser AS c_u", true, 'LEFT JOIN');
    $query = $query->joinWith("updatedUser AS u_u", true, 'LEFT JOIN');
    $query->andFilterWhere([
        'b.id' => $this->id,
        'b.created_at' => $this->created_at,
        'b.updated_at' => $this->updated_at,
        'b.status' => $this->status,
        'b.sort' => $this->sort,
        'b.created_by' => $this->created_by,
        'b.updated_by' => $this->updated_by,
    ]);
    

    关联方法

    class Brand extends \book\models\Brand
    {
        public function getCreatedUser()
        {
            return $this->hasOne(User::className(), ['id'=>'created_by']);
        }
    
        public function getUpdatedUser()
        {
            return $this->hasOne(User::className(), ['id'=>'updated_by']);
        }
    }
    
    1 条回复
    回复于 2018-06-12 10:28 回复

    由于关联查询,他衍生出来的select * form User where xxx 无法避免。所以使用left join 相对而言反而查询少一些。

    , 觉得很赞
  • 回答于 2019-06-05 18:56 举报
    1. DiscussModel 里面,定义关联表的别名member:
      public function getUser() {
      return $this->hasOne(MemberModel::class, ['user_code'=>'creator'])->alias('member');
      }

    2. 使用的地方,定义主表的别名discuss
      $query = DiscussModel::find()->innerJoinWith('user', true)->alias('discuss');
      $discuss = $query->where('parent is null')->orderBy(['hot'=>SORT_DESC])->one();

    3. 最终执行的代码:
      SQLSTATE[42S22]: Column not found: 1054 Unknown column 'parent' in 'where clause'\nThe SQL being executed was: SELECT discuss.*, member.user_code, member.nickname, member.portrait_url, member.gender FROM tbl_discuss discuss INNER JOIN tbl_member member ON discuss.creator = member.user_code WHERE parent is null ORDER BY hot DESC

    4. 从报的错可以看出,别名已经生效了,接下来解决了错误后,只返回了discuss.* 下面的值
      换了 延迟加载和即时加载都不出数据,心塞啊,sql打出来也是对的

  • 回答于 2019-06-05 19:10 举报

    加了->asArray()出数据了 花3个小时调这一个问题,有时间还是多看看api

您需要登录后才可以回答。登录 | 立即注册
yanchenghust
试用期

yanchenghust

注册时间:2015-06-07
最后登录:2015-06-27
在线时长:2小时15分
  • 粉丝0
  • 金钱0
  • 威望0
  • 积分20

热门问题