【问题标题】:From database via join to REST how does it work?从数据库通过连接到 REST 它是如何工作的?
【发布时间】:2021-06-07 05:38:10
【问题描述】:

我有一个数据库,其中包含两个具有 1:n 关系的表(订单和订单产品)。 我想将这两个表结合起来,为我的 REST-Tool 提供一个 JSON。

为此,我有以下 SQL 查询:

 $sqlQueryAll = "SELECT
                    t1.id,
                    t1.name,

                    t2.pId,
                    t2.anzahl,
                    t2.name as pName,
                    t2.preis,

                    FROM orders as t1
                  JOIN orderProducts as t2 ON t1.id = t2.orderId
                  WHERE t1.id <= ?";

在这里我会取回这个数组:

Array
(
    [0] => Array(
            [id] => 1000
            [name] => Nurten
            [pId] => 26
            [anzahl] => 1
            [pName] => Fitness-Teller
            [preis] => 12.90
        )
    [1] => Array(
            [id] => 1001
            [name] => Kutscha
            [pId] => 94
            [anzahl] => 1
            [pName] => Pizza Parma
            [preis] => 12.90
        )
    [2] => Array(
            [id] => 1001
            [name] => Kutscha
            [pId] => 75
            [anzahl] => 1
            [pName] => Pizza Margherita
            [preis] => 6.50
        )
)

我想要以下 JSON:

Array (
    [0] => Array (
        [id] => 1000
        [name] => Nurten
        [products] => Array(
                [0] => Array(
                        [pId] => 26
                        [anzahl] => 1
                        [pName] => Fitness-Teller
                        [preis] => 12.90
                    )
           )
    )
    [1] => Array (
        [id] => 1001
        [name] => Kutscha
        [products] => Array(
                [0] => Array(
                        [pId] => 94
                        [anzahl] => 1
                        [pName] => Pizza Parma
                        [preis] => 12.90
                    )
                [1] => Array(
                        [pId] => 75
                        [anzahl] => 1
                        [pName] => Pizza Margherita
                        [preis] => 6.50
                    )
            )

    )
)

为此,我正在使用以下工作 PHP 代码:

$artikelFields = ['pId', 'anzahl', 'pName', 'preis'];
$id_="";  #new Product Kenner
$orders = [];
$i = -1;
foreach ($result2 as $row)  {

    if ($row['id'] != $id_) {

          # reset
          $i++;
          unset($order);
          $id_ = $row['id'];

          # write Array from Fields without $artikelFields
          foreach ($row as $field =>$value)  {
            if (!in_array($field, $artikelFields)) {
              $order[$field] = $value;
            }
          }

          # write Artikel to array[products]
          $newArtikel = array();
          foreach ($artikelFields as $a)  {
              $newArtikel[$a] = $row[$a];
          }
          $order['products'][] = $newArtikel;

    } else {

          # write only array[products]
          $newArtikel = array();
          foreach ($artikelFields as $a)  {
              $newArtikel[$a] = $row[$a];
          }
          $order['products'][] = $newArtikel;

    }

    $orders[$i] = $order;


} /* !foreach */

我有点不放心,为什么这看起来很复杂。没有更方便的方法来实现这一点吗? (可能还有其他查询)。

【问题讨论】:

  • 查询无法生成嵌套数组,因此您必须自己以一种或另一种方式重构结果。话虽如此,您正在寻求改进的工作解决方案将更适合Code review
  • 为什么认为这段代码很复杂?是否存在任何性能问题,或者您是否遇到代码产生错误输出的情况?

标签: php mysql arrays mariadb


【解决方案1】:

对数据进行分组的一种简单方法是使用“共享”键(此处为用户 ID),在您第一次遇到用户 ID 时初始化该行,然后将产品添加到“产品”键中。

$out = [];
foreach ($results as $result)
{
    if (!isset($out[$result['id']])) {
       $out[$result['id']] = [
          'id'   => $result['id'],
          'name' => $result['name'],
       ];
    }

    $out[$result['id']]['products'][] = [
          'pId'    => $result['pId'],
          'anzahl' => $result['anzahl'],
          'pName'  => $result['pName'],
          'preis'  => $result['preis'],
    ];
}
var_export(array_values($out));

demo

你也可以使用array_filter

$out = [];
foreach ($results as $result)
{
    if (!isset($out[$result['id']])) {
       $out[$result['id']] = array_filter($result, function($key) { 
        return in_array($key, ['id','name']); 
    }, ARRAY_FILTER_USE_KEY);
    }

    $out[$result['id']]['products'][] = array_filter($result, function($key) { 
        return in_array($key, ['pId','anzahl','pName','preis']); 
    }, ARRAY_FILTER_USE_KEY);
}
print_r(array_values($out));

demo

【讨论】:

  • 你在哪里设置id?获取错误:尝试获取非对象的属性“id”
  • 我使用了$result-&gt;id 而不是$result['id'](更新答案)。
  • 仍然出现错误:尝试获取非对象的属性“id”
  • 你能看看这个演示3v4l.org/q0jN4 吗? (错过了另一个'->')。
  • 好的,我明白了。 array_values() 可以解决问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2019-05-22
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多