【问题标题】:PHP: Disambiguating Column Names on Join Using MysqliPHP:使用 Mysqli 消除连接时的列名歧义
【发布时间】:2014-02-04 13:31:57
【问题描述】:

此问题与由于 JOIN 中的列名冲突而丢失数据有关。具体来说,使用 PHP 的 mysqli 并将数据作为 JSON 对象返回。

假设您有两个使用另一个查找表相​​互关联的表。

例如,假设您有用户:

user

id      name
---------------------
1       John Thomas

和食谱:

recipe

id     name
---------------------
15     Fried Chicken

这些配方的所有权/权利在查找表中定义:

user_recipe

user   recipe
--------------
1      15

因此,在这种情况下,John Thomas 有权查看炸鸡食谱。

假设您想要获取包含所有这些数据的记录,因此您构建一个这样的查询:

SELECT *
FROM `user_recipe`
  INNER JOIN `recipe`
    ON `recipe`.id = `user_recipe`.recipe
  INNER JOIN `user`
    ON `user`.id = `user_recipe`.user;

现在假设您正在使用 PHP 的 mysqli 对象。然后您使用json_encode 并将数据交还给您的javascript。伟大的!除了数据看起来像这样:

{
    id:15,
    user:1,
    recipe:15,
    name:"Fried Chicken"
}

您如何解决此问题?你可以使用别名,但是如果有更多的列并且你不想把它们都写出来怎么办?

【问题讨论】:

  • 您真的需要从所有表中获取所有列吗?通常你只需要一组特定的列,你可以使用别名。
  • 通常你只需要一个特定的集合。我使用它的情况是构建一个 MVC 框架,您希望能够在不知道所有列名的情况下提取“组合”数据。
  • 你可以做的另一件事是尽量避免在不同的表中使用相同的列名,除非它们是外键(因为它们来自哪个表并不重要,它们应该是一样)。
  • 这也是个好主意。这不应该是一个万能的解决方案。这只是一种选择。

标签: javascript php sql json mysqli


【解决方案1】:

如果您使用 mysqli 的方法 fetch_fields,您可以将数据重新分组,或者为字段名称添加前缀,或者您想要的任何其他内容。

这是一个例子:

$sql = '...QUERY...';
$mysqli->query($sql);
$fields = $result->fetch_fields();
$output = array();
while ($row = $result->fetch_array())
{
    $newoutput = array();
    foreach($row as $key=>$value)
    {
        if (is_numeric($key))
            $newoutput[$fields[$key]->table][$fields[$key]->name] = $value;
    }
    $output[] = $newoutput;
}
$result->free();
echo json_encode($output);

做完之后,数据会以这种格式传回:

{
    user_recipe:{
        user:1,
        recipe:15
    },
    user:{
        id:1,
        name:"John Thomas"
    },
    recipe:{
        id:15,
        name:"Fried Chicken"
    }
}

当然,您可以随心所欲地构建 JSON 对象。

【讨论】:

    猜你喜欢
    • 2014-11-21
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多