V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jd186
V2EX  ›  PHP

一个项目表,点开每一个项目里的字段都不一样。请教下怎么实现。

  •  
  •   jd186 · 2018-09-17 14:02:24 +08:00 · 2623 次点击
    这是一个创建于 2019 天前的主题,其中的信息可能已经有所发展或是发生改变。

    首先是一个项目记录表。 每一个点开的项目表字段都不一样 每一个项目点开后的记录都有上千条。 每一个项目点开后的表头字段也都不一样有的 3,4 列字段,有的 10 几列字段

    请教下怎么实现比较好。

    13 条回复    2018-09-18 09:19:47 +08:00
    RihcardLu
        1
    RihcardLu  
       2018-09-17 14:06:58 +08:00 via iPhone
    专门建一个表存字段,值存在另一张表里
    opengps
        2
    opengps  
       2018-09-17 14:11:13 +08:00
    这时候似乎很适合 mongo 数据库的 json 存储
    ben1024
        3
    ben1024  
       2018-09-17 14:13:46 +08:00
    外层进行规范格式,内层一个大 JSON 存储
    breezeFP
        4
    breezeFP  
       2018-09-17 14:29:43 +08:00
    我现在在做的一个功能和你的需求很像,字段列不固定,用 mongo 存储
    saulshao
        5
    saulshao  
       2018-09-17 15:44:23 +08:00
    抽出来一个表,只建立比较少的字段,例如项目 ID,名称,编号。
    其他的字段则建立一个纵向表,用 N-V 对来存储数据。
    AngryPanda
        6
    AngryPanda  
       2018-09-17 15:47:07 +08:00
    shaojz2005
        7
    shaojz2005  
       2018-09-17 15:53:32 +08:00
    如果每个项目的字段差异性非常大,可以散列存储,每个项目都可以自定义字段,不把字段做成固定的表。

    如果所有项目的字段总量是基本稳定的,只是每个项目都有选择性的填一些,那么可以全部定义出来,然后项目选填,前端页面渲染时,有内容就展示,无内容则隐藏。
    DavidNineRoc
        8
    DavidNineRoc  
       2018-09-17 15:56:02 +08:00
    正好最近在做一个类似的功能:
    fields 表,存列表锁展示的字段
    id name table_name field_name
    1 主键 users id
    2 名字 users username
    3 年龄 users age
    4 主键 orders id
    5 订单号 orders number
    6 总价 orders total

    users 表
    id username age
    1 david 12
    2 loc 21


    orders 表
    id number total
    1 12 11.4
    2 4 58


    ## 现在在用户列表页面
    $fields = Field::where('table_name', 'users')->get();
    $users = User::latest()->get();

    // 显示列表
    foreach ($users as $user) {
    foreach ($fields as $field) {
    echo $user->{$field}
    }
    echo '<br>';
    }


    ## 订单列表
    $fields = Field::where('table_name', 'orders')->get();
    $orders= Order::latest()->get();

    // 显示列表
    foreach ($ordersas $order) {
    foreach ($fields as $field) {
    echo $order->{$field}
    }
    echo '<br>';
    }


    ####
    其实更建议使用 数据表格 控件,把字段和数据分别赋值到数据表格,他会自动展示 ,不需要你遍历。
    ####
    还可以做成显示那个字段,当用户点了隐藏不看某个字段之类的。
    bsg1992
        9
    bsg1992  
       2018-09-17 17:18:03 +08:00
    看你用上面数据库来持久化数据了。关系型数据库就是把共同的字段抽取出来单独一张表。然后剩余的属性建立一个 Key Value 的表,与其关联即可。
    或者使用文档型数据库直接存储 json 文档到时直接取出即可。
    winglight2016
        10
    winglight2016  
       2018-09-17 19:46:54 +08:00
    看起来 postgresql 比较适合你,同时支持关系数据库和 json 格式字段,不过,具体还是要分析一下为什么不同项目之间字段差异很大?
    wizardforcel
        11
    wizardforcel  
       2018-09-17 22:22:14 +08:00 via Android
    一个项目存成多条,(项目 id,字段名,值)
    xuanbg
        12
    xuanbg  
       2018-09-17 22:24:26 +08:00
    mysql 从 5.6 开始支持 JSON 类型,或者 MongoDB 了解一下
    NEETLEE
        13
    NEETLEE  
       2018-09-18 09:19:47 +08:00
    我遇到这种情况都是把他们个性的字段打包成一个 json 然后把 json 存进某个字段里面,这样表结构就可以固定下来了,不好的地方就是,每次要用到的时候都要把 json 解析成对象
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1191 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:18 · PVG 07:18 · LAX 16:18 · JFK 19:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.