hasMany 连接的关系不是 =,而是 in,该如何处理? [ 2.0 版本 ]
我做一个商品合集的功能
商品合集表有一个字段来记录这个商品合集包含哪些商品(例如: '12,2,3,4';'2,4,5,6'
)
我想在 hasMany
的时候能不能类似于 return $this->hasMany(Goods::className(), ['in', 'id', 'good_ids']);
当然,我知道 hasMany
不支持这种写法
共 3 个回答
-
从你问的问题来看,你好像不是表连接的问题,而是条件查询的问题。
表连接具体值的情况,目前没有见到过。目前都是:user.user_id = info.user_id
类似上述用表的字段去关联,而不是具体值。
回到你说的业务里,字段里是一个逗号分割的字符串,直接在where里写过滤条件就行,而不是连接条件。希望你对这两个概念区分下。共 1 条回复LaravelCode 觉得很赞 -
zone_g@163.com 回答于 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 条回复zone_g@163.com 回复于 2019-03-16 11:16 回复可以写到预加载或者用join查询
其实yii2hasOne或many也就是这个原理 他们只是创建一个查询器 但是并没有查询 当你调用的时候才去查询 所以第二种方法的最后没有all()zone_g@163.com 回复于 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最底层的代码,原理是一样的
@zone_g@163.com 嗯嗯,你说的很对,hasmany只是声明了一个link
数字派 北京
最后登录:2023-03-07
在线时长:52小时34分
- 粉丝10
- 金钱1515
- 威望10
- 积分2135