# 前言

吐槽 thinkphp 说简单很简单 说麻烦真麻烦
官网讨论里,只有问题却没有答案
不知道为什么多对多关联中 field () 无效,找了半天也没有找到关于多对多的问题
这里以 cards 为例 只显示 id、des、 status
记录解决办法

# 多对多限制字段显示的两种方式

本来用方式一,但是如果主表字段多起起来,一个个显示好麻烦,考虑怎么只限制关联表字段
一开始看别人这么写不成功, $v->getRelation ('cards')->visible (['id','des','status']);
提示错误 Call to a member function visible () on array
打印了 $v->getRelation ('cards'); 发现这是个数组,本来想 foreach 循环 再用 visible
然后想着 collection () 包装了下,成功了

  • 参考链接 https://blog.csdn.net/qq_19598963/article/details/113681534
<?php
            public function index()
            {
                $list = $this->model
                    ->with('cards')
                    ->select();
    
                foreach ($list as $k => $v){
    
                    //TODO 限制数据显示
                    // 方式一
                    $v->visible(['id','name','cards.id','cards.des','cards.status']);
      
                    // 方式二
                    collection($v->getRelation('cards'))->visible(['id','des','status']);
    
                    // 同理 hidden 隐藏字段
                    $v->hidden(['cards.pivot']);
                }
            }

# 多对多 wherePivot 过滤条件

public function cards()
    {
        // 只显示 status 大于 0 的关联信息
        return $this->belongsToMany('app\admin\model\PersonalCard','app\admin\model\GroupCard','cardID', 'groupID')
            ->wherePivot('status','>',0);
    }