【问题标题】:PHP: Best practise / API Function to consolidate SQL data 1:N to a 2d arrayPHP:将 SQL 数据 1:N 合并到二维数组的最佳实践/API 函数
【发布时间】:2021-10-18 05:37:53
【问题描述】:

我经常遇到我有 1:N 关系的情况,例如一个项目表和另一个表,其中包含每个项目的附加元数据/属性。

考虑这个例子:

users
+-----------+-----------+
| user_id   | username  |
+-----------+-----------+
| 1         |  max      |
| 2         |  john     |
| 3         |  elton    |
| 4         |  tom      |
| 5         |  dave     |
+-----------+-----------+

user_profile_data
+-----+-----------+-----------+
| uid | field_id  | field_val |
+-----+-----------+-----------+
|  1  | 1         |  a        |
|  1  | 2         |  b        |
|  2  | 1         |  c        |
|  2  | 2         |  d        |
|  3  | 1         |  e        |
|  3  | 2         |  f        |
|  3  | 3         |  g        |
|  4  | 1         |  h        |
|  4  | 4         |  i        |
+-----+-----------+-----------+

现在我有两个问题: 我想选择扩展的用户数据,每个(uid,field_id)组合都是唯一的,通常我这样做:

SELECT u.user_id, u.username, upd.field_id, upd.field_val
FROM users u
LEFT JOIN user_profile_data upd ON u.user_id = upd.uid

我为每个用户/字段组合得到一行,并且需要在 php 中“重新排序”,因为通常我想要一个包含每个用户的数组,其中包含扩展属性的子数组,例如:

$users = array(1 => array('username' => max, 'data' => array(1 => 'a', 2 => 'b')), 2 => array('username' => 'john', ...));

是否有一种标准化的方法来简化这一点和/或在这种情况下最佳做法是什么? PHP 中是否已经内置了一些东西(不是外部 SQL 框架)?

谢谢

【问题讨论】:

  • 您当前发布的样本数据的结果集是什么?您从样本数据中获得的确切结果集是什么?请不要“yatta-yatta”你想要的。 minimal reproducible example 始终是首选。你想要GROUP_CONCAT()吗?您想在 PHP 中合并结果集行吗?如果是这样,我们有大量页面演示了使用临时键、合并,然后重新索引第一级键。
  • usually I want to have an array which contains every User with a Subarray of extended attributes, for example like this。我想要一个用户数组,对于每个用户,他的数据应该作为子数组直接附加到他身上。
  • 这在我看来像 ORM。 Afaik,没有内置的 PHP ORM 可以为您执行此操作,您必须自己构建它或使用第 3 方库。看看 Doctrine 或 Eloquent,两者都非常好并且有据可查的 ORM
  • 实际上只是使用普通的 Wordpress API,所以是的,这些都是恕我直言,主要是普通的 mysqli 函数

标签: php mysql arrays multidimensional-array


【解决方案1】:

这样的东西应该可以工作(没有测试,抱歉)

$users = [];
foreach($results as $result) { // assuming $results contains DB results
    if (!isset($users[$result['user_id']])) {
        $user[$result['user_id']] = [];
        $user[$result['user_id']]['username'] = $result['username'];
        $user[$result['user_id']]['data'] = [];
    }
    $user[$result['user_id']]['data'][$result['field_id']] = $result['field_val'];
}

这不是通用代码,您应该为每个表模式调整它,但我不知道更简单的方法。或者您通过不执行“JOIN”查询向您的 SQL 服务器发送垃圾邮件...:/(我认为您的 sql 更好:))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    相关资源
    最近更新 更多