2017-04-14 15:43:57 7918次浏览 5条回答 2 悬赏 10 金钱
  • news表有 news_id
  • tag表有 tag_id
  • news_tag 是中间表 有个 news_idtag_id
    app\Models\News.php有个getTag方法如下怎么实现一对多关联查询
    public function getTag()
      {
         //这里面怎么关联hasMany、、、、、、
      }
    

    求解答

最佳答案

  • 阿江 发布于 2017-04-14 16:48 举报

    在News(AR类)中要写个getter:

        public function getTag()
        {
            return $this->hasMany(Tags::className(), ['id' => 'tags_id'])
                ->viaTable(NewsTags::tableName(),['news_id'=>'id'])->asArray();
        }
    
    4 条回复
    回复于 2017-04-14 17:04 回复

    id是哪里的,TbArticlesTags这个表又是哪里的

    回复于 2017-04-14 17:10 回复

    刚写错了,用一个get就可以了

    回复于 2017-04-14 17:13 回复

    可是里面没有叫id的这个字段啊,名字改过来就好了
    Getting unknown property: app\models\News::id 报错了

    回复于 2017-04-14 17:15 回复


    public function getTag()

    {
        return $this->hasMany(Tags::className(), ['tag_id' => 'tag_id'])
            ->viaTable(NewsTags::tableName(),['news_id'=>'news_id'])->asArray();
    }
    
  • 回答于 2017-04-14 15:58 举报

    不能一次就查出结果,我的方法是:
    现在 news_tag 模型中获取标签的id组合成一个数组
    然后返回这个数组,再去标签中使用in获取到标签的信息,再返回出来。

    2 条回复
    回复于 2017-04-14 16:20 回复

    手册上写的是可以啊

    //举例而言,如果 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']);
        }
    }
    
    回复于 2017-04-14 16:32 回复

    然后呢?你获取到数据了吗?

  • 回答于 2017-04-14 16:29 举报

    你这里是三张表,而不是两张表

    2 条回复
    回复于 2017-04-14 16:31 回复

    三个怎么关联嘛

    回复于 2017-04-14 16:40 回复

    用hasMany应该没办法实现,hasMany是针对两张表间关联关系(可能不准确)

  • 回答于 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]);
    }
    
  • 回答于 2017-04-19 22:38 举报

    今天我研究了一下,我来分享下:

    三张表:

    1. 文章表:article(id, article_name)
    2. 标签表:tag(id, tag_name)
    3. 文字和标签对应表 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 条回复
    回复于 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分
  • 粉丝3
  • 金钱1065
  • 威望10
  • 积分1365

热门问题