在列表显示名称,而不是id

Stranger 2017-9-28 1887

1.app/common.php底部

function addtion($items, $fields)
{
    if(!$items)
        return $items;
    $fieldsArr = [];
    if (!is_array($fields))
    {
        $arr = explode(',', $fields);
        foreach ($arr as $k => $v)
        {
            $fieldsArr[$v] = ['field' => $v];
        }
    }
    else
    {
        foreach ($fields as $k => $v)
        {
            if (is_array($v))
            {
                $v['field'] = isset($v['field']) ? $v['field'] : $k;
            }
            else
            {
                $v = ['field' => $v];
            }
            $fieldsArr[$v['field']] = $v;
        }
    }
    foreach ($fieldsArr as $k => &$v)
    {
        $v = is_array($v) ? $v : ['field' => $v];
        $v['display'] = isset($v['display']) ? $v['display'] : str_replace(['_ids', '_id'], ['_names', '_name'], $v['field']);
        $v['primary'] = isset($v['primary']) ? $v['primary'] : '';
        $v['column'] = isset($v['column']) ? $v['column'] : 'name';
        $v['model'] = isset($v['model']) ? $v['model'] : '';
        $v['table'] = isset($v['table']) ? $v['table'] : '';
        $v['name'] = isset($v['name']) ? $v['name'] : str_replace(['_ids', '_id'], '', $v['field']);
    }
    unset($v);
    $ids = [];
    $fields = array_keys($fieldsArr);
    foreach ($items as $k => $v)
    {
        foreach ($fields as $m => $n)
        {
            if (isset($v[$n]))
            {
                $ids[$n] = array_merge(isset($ids[$n]) && is_array($ids[$n]) ? $ids[$n] : [], explode(',', $v[$n]));
            }
        }
    }
    $result = [];
    foreach ($fieldsArr as $k => $v)
    {
        if ($v['model'])
        {
            $model = new $v['model'];
        }
        else
        {
            $model = $v['name'] ? \think\Db::name($v['name']) : \think\Db::table($v['table']);
        }
        $primary = $v['primary'] ? $v['primary'] : $model->getPk();
        $result[$v['field']] = $model->where($primary, 'in', $ids[$v['field']])->column("{$primary},{$v['column']}");
    }
    foreach ($items as $k => &$v)
    {
        foreach ($fields as $m => $n)
        {
            if (isset($v[$n]))
            {
                $curr = array_flip(explode(',', $v[$n]));
                $v[$fieldsArr[$n]['display']] = implode(',', array_intersect_key($result[$n], $curr));
            }
        }
    }
    return $items;
}
  1. 在你想要的控制器加
$list = addtion($list, 'host_ids');

3.对应js(这个不可以搜索)

{field: 'host_names', title: __('Host_id'), operate: false, formatter: Table.api.formatter.label},

如图我只关联一个:
https://cdn.forum.fastadmin.net/uploads/201709/28/ed812d47f877c7837804bcc23499a3bc

最后于 9月前 被Karson编辑
感谢以下的小伙的赞赏支持
最新回复 (25)
  • Karson 打赏 2017-9-28
    感谢TA
    0 引用 2

    @Stranger
    addtion第二个参数支持多种格式。如下

    $list = addtion($list, 'category_id,category_ids');

    $list = addtion($list, ['category_id', 'category_ids']);

    $list = addtion($list, [
        [
            'field'    => 'category_id',
            'display'  => 'category_name',
            'primary'  => 'id',
            'column'   => 'name',
            'model'    => '\app\common\model\Category',
            'name'     => 'Category',
            'table'    => 'Category'
        ],
        [
            'field'    => 'category_ids',
            'display'  => 'category_names',
            'primary'  => 'id',
            'column'   => 'name',
            'model'    => '\app\common\model\Category',
            'name'     => 'Category',
            'table'    => 'Category'
        ]
    ]);

    前两种会自动读取category表,且自动渲染为category_name、category_names字段
    一般情况下我们都使用前两种即可,如果有使用特殊字段则需要使用第三种方式。

    最后于 2017-9-28 被Karson编辑
  • snowleopard 9月前
    感谢TA
    0 引用 3

    请问 $list = addtion($list, 'category_id,category_ids');
    这个具体是加在哪里啊?
    控制器下的_initialize()?

  • Stranger 楼主 9月前
    感谢TA
    0 引用 4
    snowleopard 请问 $list = addtion($list, 'category_id,category_ids'); 这个具体是加在哪里啊? 控制器下的_initialize()?

    控制器下的index方法

  • very bad 8月前
    感谢TA
    0 引用 5

    写哪都是数组未定义索引

  • F4NNIU 打赏 8月前
    感谢TA
    0 引用 6

    感谢分享,已经打赏。

  • yongnan_wong 6月前
    感谢TA
    0 引用 7

    list是怎么获取的

  • jiushang1314 1月前
    感谢TA
    0 引用 8

    mark一下

  • likeni 13天前
    感谢TA
    0 引用 9

    报错了

  • holyson 5天前
    感谢TA
    0 引用 10

    与其叫分享,不如叫‘自己’的笔记,点赞sneezing_face

  • 千鸟 5天前
    感谢TA
    0 引用 11

    老实说,我都不知道这个改了是什么效果...

  • myIvan 5天前
    感谢TA
    0 引用 12

    不知道在讲什么?难道我开小差了?

  • likeni 1天前
    感谢TA
    0 引用 13

    未知的数据错误,把字段名称改为我的表字段名称还是报错
    在你想要的控制器加
    $list = addtion($list, 'host_ids');
    3.对应js(这个不可以搜索)

    {field: 'host_names', title: __('Host_id'), operate: false, formatter: Table.api.formatter.label},

  • likeni 1天前
    感谢TA
    0 引用 14

    /**

     * 查看
     */
    public function index()
    {
        //设置过滤方法
        $this->request->filter(['strip_tags']);
        if ($this->request->isAjax()) {
            //如果发送的来源是Selectpage,则转发到Selectpage
            if ($this->request->request('keyField')) {
                return $this->selectpage();
            }
            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
            $total = $this->model
                ->where($where)
                ->order($sort, $order)
                ->count();
    
            $list = $this->model
                ->where($where)
                ->order($sort, $order)
                ->limit($offset, $limit)
                ->select();
    
            $list = addtion($list, 'nowbing_ids');
            $list = collection($list)->toArray();
            $result = array("total" => $total, "rows" => $list);
    
            return json($result);
        }
        return $this->view->fetch();
    }
  • likeni 1天前
    感谢TA
    0 引用 15

    $list = addtion($list, 'nowbing_ids'); 按照缘教程和我的字段名称都试过,报错

  • likeni 1天前
    感谢TA
    0 引用 16

    {field: 'host_names', title: __('Host_id'), operate: false, formatter: Table.api.formatter.label},这个也是按照缘教程和我的字段名称都试过,报错

  • Stranger 楼主 1天前
    感谢TA
    0 引用 17
    likeni {field: 'host_names', title: __('Host_id'), operate: false, formatter: Table.api.formatter.label},这个 ...

    这个之前版本的,model用belongsTo,控制器就with()使用

  • Stranger 楼主 1天前
    感谢TA
    0 引用 18
    holyson 与其叫分享,不如叫‘自己’的笔记,点赞:sneezing_face:

    都快一年的了,新版教程可以搜索论坛

  • Stranger 楼主 1天前
    感谢TA
    0 引用 19
    千鸟 老实说,我都不知道这个改了是什么效果...

    只是把关联数据以自己需要的字段显示,而不是以ID数字显示

  • likeni 1天前
    感谢TA
    0 引用 20

    @Stranger 没有找到可以用的教程,如果你看到了麻烦推荐我一个

  • Stranger 楼主 1天前
    感谢TA
    0 引用 21

    控制器

    $total = $this->model
                    ->with('admin')
                    ->where($where)
                    ->order($sort, $order)
                    ->count();
    
                $list = $this->model
                    ->with('admin')
                    ->where($where)
                    ->order($sort, $order)
                    ->limit($offset, $limit)
                    ->select();

    模型

        public function admin()
        {
            return $this->belongsTo("app\admin\model\Admin", "admin_id", 'id', [], 'LEFT')->setEagerlyType(0);
        }

    JS

    {field: 'admin.nickname', title: __('Admin_id'),formatter: Table.api.formatter.label, operate: false},
    最后于 1天前 被Stranger编辑
  • likeni 1天前
    感谢TA
    0 引用 22

    谢谢,非常感谢。我想问下调用多选调用显示方法一样吗?

  • likeni 1天前
    感谢TA
    0 引用 23

    还有,是不是这个表里面需要建立Admin_id字段

  • Stranger 楼主 21小时前
    感谢TA
    1 引用 24
    likeni 还有,是不是这个表里面需要建立Admin_id字段

    对的,要相对于的字段admin_id

  • 千鸟 21小时前
    感谢TA
    0 引用 25

    哦 ~ 这样,如果是多对一的时候只能显示第一个?还是都能显示出来呢?
    例如,admin_id 里面存了 1,2,3 ,可以把关联的管理员都显示出名称来吗?

  • 未登录
    27
返回