两个表关联查询,有个中间表,hasMany怎么实现? [ 2.0 版本 ]
news
表有news_id
tag
表有tag_id
news_tag
是中间表 有个news_id
和tag_id
app\Models\News.php
有个getTag
方法如下怎么实现一对多关联查询public function getTag() { //这里面怎么关联hasMany、、、、、、 }
求解答
最佳答案
-
在News(AR类)中要写个getter:
public function getTag() { return $this->hasMany(Tags::className(), ['id' => 'tags_id']) ->viaTable(NewsTags::tableName(),['news_id'=>'id'])->asArray(); }
共 4 条回复@wangwenfan 刚写错了,用一个get就可以了
@wangwenfan
public function getTag(){ return $this->hasMany(Tags::className(), ['tag_id' => 'tag_id']) ->viaTable(NewsTags::tableName(),['news_id'=>'news_id'])->asArray(); }
其他 4 个回答
-
dashixiong 回答于 2017-04-14 15:58 举报
不能一次就查出结果,我的方法是:
现在 news_tag 模型中获取标签的id组合成一个数组
然后返回这个数组,再去标签中使用in获取到标签的信息,再返回出来。共 2 条回复手册上写的是可以啊
//举例而言,如果 order 表和 item 表通过中间表 order_item 关联起来, 可以在 Order 类声明 items 关联关系取代中间表: class Order extends \yii\db\ActiveRecord { public function getItems() { return $this->hasMany(Item::className(), ['id' => 'item_id']) ->viaTable('order_item', ['order_id' => 'id']); } }
dashixiong 回复于 2017-04-14 16:32 回复@wangwenfan 然后呢?你获取到数据了吗?
-
johnny1991 回答于 2017-04-14 16:29 举报
你这里是三张表,而不是两张表
共 2 条回复johnny1991 回复于 2017-04-14 16:40 回复@wangwenfan 用hasMany应该没办法实现,hasMany是针对两张表间关联关系(可能不准确)
-
this_summer 回答于 2017-04-19 11:54 举报
public function getSku(){
return $this->hasMany(GoodsSku::className(),['goods_id'=>'id'])->where(['goods_sku.status' => GoodsSku::SKU_IS_SALE])->orderBy(['price'=>SORT_ASC]); }
-
zhaonan420 回答于 2017-04-19 22:38 举报
今天我研究了一下,我来分享下:
三张表:
- 文章表:article(id, article_name)
- 标签表:tag(id, tag_name)
- 文字和标签对应表 article_tag (id, article_id, tag_id);
三个表模型生成,其中在文章ArticleModel 中增加:
public function getTags() { return $this->hasMany(Tag::className(), ['id' => 'tag_id']) ->viaTable('{{%article_tag}}', ['article_id' => 'id']) ->asArray(); }
我要获取 文章id为 1 对应的所有标签;
$model = Article::findOne(1); $data = $model->tags; var_dump($data);die;
结果如下:
array (size=3) 0 => array (size=2) 'id' => string '1' (length=1) 'tag_name' => string 'php' (length=3) 1 => array (size=2) 'id' => string '6' (length=1) 'tag_name' => string '技术' (length=6) 2 => array (size=2) 'id' => string '7' (length=1) 'tag_name' => string '大牛' (length=6)
共 1 条回复NingerJohn 回复于 2018-08-14 17:02 回复你好,问个问题。假设场景如下,想查出来每个用户购买商品的积分,用户有推荐人和购买人2个角色,也就是说用户表和订单表是2个字段or关联的方式。这种如何用hasMany描述?
用户表 : user ( uid, name )
订单表 : order ( order_id, recommend_uid, buy_uid )
订单商品表 : order_item ( item_id, order_id, recommend_jifen, buy_jifen )public function getJifens() { return $this->hasMany(OrderItem::className(), ['item_id' => 'uid']) ->viaTable('order', ['recommend_uid' => 'uid', 'buy_uid'=>'uid']) // 这个地方如何指定 on uid=recommend_uid or uid = buy_uid ->asArray(); }
如果用sql查询的话,应该是这样的
SELECT uid, SUM( CASE WHEN u.uid = o.recommend_id THEN oi.recommend_jifen WHEN u.uid = o.buy_uid THEN oi.buy_jifen ELSE 0 END ) FROM USER u LEFT JOIN ORDER o ON o.recommend_uid = u.uid OR o.buy_uid = u.uid LEFT JOIN order_item oi ON oi.item_id = o.order_id
王文凡 ChengDu
注册时间:2016-04-11
最后登录:2018-07-26
在线时长:20小时44分
最后登录:2018-07-26
在线时长:20小时44分
- 粉丝3
- 金钱1065
- 威望10
- 积分1365