【发布时间】: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
-
@tim 你用的是mysqli还是pdo? phpdelusions.net/pdo/fetch_modes#FETCH_GROUPstackoverflow.com/a/18094518/2943403
-
实际上只是使用普通的 Wordpress API,所以是的,这些都是恕我直言,主要是普通的 mysqli 函数
标签: php mysql arrays multidimensional-array