2019-03-13 23:08:02 2058次浏览 3条回答 0 悬赏 100 金钱

我做一个商品合集的功能

商品合集表有一个字段来记录这个商品合集包含哪些商品(例如: '12,2,3,4';'2,4,5,6'

我想在 hasMany 的时候能不能类似于 return $this->hasMany(Goods::className(), ['in', 'id', 'good_ids']);

当然,我知道 hasMany 不支持这种写法

  • 回答于 2019-03-14 08:55 举报
    return Goods()::find()->where(['id'=>$this-> good_ids])->all;
    

    这样可以获得数据,但是没法在其他地方使用with之类的,坐等更好办法~

    1 条回复
    回复于 2019-03-14 09:32 回复

    你说的对,而且也没办法直接输出,比如放在数据提供器里使用

  • 回答于 2019-03-14 16:18 举报

    从你问的问题来看,你好像不是表连接的问题,而是条件查询的问题。
    表连接具体值的情况,目前没有见到过。目前都是:

    user.user_id = info.user_id
    

    类似上述用表的字段去关联,而不是具体值。
    回到你说的业务里,字段里是一个逗号分割的字符串,直接在where里写过滤条件就行,而不是连接条件。希望你对这两个概念区分下。

    1 条回复
    回复于 2019-03-15 13:47 回复

    其实,我只是想省去一个“中间表”,但是后来发现YII2还是不支持这种写法,应该按照数据库设计范式,所以我就加上了一个中间表,问题也就不存在了。

    觉得很赞
  • 回答于 2019-03-16 10:41 举报

    情况一:如果你的集合表和商品表有一个独立对应的关联字段(其实这个字段没什么用,只是迎合Yii的hasMany写法)
    return $this->hasMany(Goods::className(), ['商品关联字段(如:userid)', '商品库关联字段(如:userid)'])->andWhere([Yii::$app->db->schema->getRawTableName(Goods::::tableName()).".id" => $this-> good_ids]);//两个userid是一致的
    情况二:如果两个表没有独立对应的字段
    return Goods()::find()->where(['id'=>$this-> good_ids]);

    两种写法都没用过,想想的思路,可以试一下,望回复验证结果

    4 条回复
    回复于 2019-03-16 11:12 回复

    第一种先不说,但是第二种肯定不行,你获取一个商品合集列表再循环page_size次调用这个语句,那就是page_size次的查询。。。

    回复于 2019-03-16 11:16 回复

    可以写到预加载或者用join查询
    其实yii2hasOne或many也就是这个原理 他们只是创建一个查询器 但是并没有查询 当你调用的时候才去查询 所以第二种方法的最后没有all()

    回复于 2019-03-16 11:20 回复


    protected function createRelationQuery($class, $link, $multiple)

    {
        /* @var $class ActiveRecordInterface */
        /* @var $query ActiveQuery */
        $query = $class::find();
        $query->primaryModel = $this;
        $query->link = $link;
        $query->multiple = $multiple;
        return $query;
    }
    

    这个是hasmany最底层的代码,原理是一样的

    回复于 2019-03-16 11:24 回复

    嗯嗯,你说的很对,hasmany只是声明了一个link

您需要登录后才可以回答。登录 | 立即注册
数字派
总监

数字派 北京

注册时间:2016-04-19
最后登录:2023-03-07
在线时长:52小时34分
  • 粉丝10
  • 金钱1515
  • 威望10
  • 积分2135

热门问题