Cakephp 4 将子查询从控制器传递到视图

问题描述 投票:0回答:1

我正在尝试从数据库创建订单摘要,数据库中的每一行都包含每个项目的单独行,并通过订单号链接在一起。

订单号 项目 客户名称
ord001 小工具 乔·布洛格斯
ord001 东西 乔·布洛格斯
ord002 小工具 弗莱德·打火石

我正在尝试创建的是单个页面上每个订单号的摘要,因此它看起来像这样:-

订单号 ord001
客户姓名 乔·布洛格斯
项目 小工具
项目 东西
订单号 ord002
客户姓名 弗雷德打火石
项目 小工具

我可以通过在控制器内使用 echo 来使其在一定程度上发挥作用 这是我的控制器:-

    {
        $tomorrow = date("Y-m-d", strtotime('tomorrow'));
        $customer = $this->Customer->find()
            ->select(['order_number' => 'DISTINCT order_number'])
            ->where(['Customer.del_date LIKE' => $tomorrow])
            ->where (['Customer.van_number LIKE' => '2 - Internet Van']);

        $this->set('customer',$customer);

            foreach ($customer->all() as $order) {
            $ordnumber = ($order->order_number);
            echo $ordnumber."<br />";
            $orders = ($this->Customer->find()
                ->where(['order_number' => $ordnumber])
            );
            $this->set(compact('orders'));
          
            foreach ($orders as $order) {
            echo $order->item."<br />";
            }
           echo $order->customer_name."<br />";
            echo "<hr>";
            }

    

}

我的问题是,当我尝试将相同的变量传递给视图时,它只显示循环中的最后一个订单,在本例中是 ord002,这让我感到困惑,这是我的视图

<?php foreach ($orders as $order) { ?>
<?= h($order->item) ?>
<br >
    <?php } ?>

<?= h($order->customer_name) ?>
php cakephp cakephp-4.x
1个回答
0
投票

您正在覆盖

$orders
(在您看来)每次调用
$this->set(compact('orders'));

您应该尝试将每个输出逻辑都放在视图中(而不是控制器中)。在控制器中获取数据(利用

HasMany
关系和
->contain()
)。

在您的视图中循环浏览您的客户和订单。

在循环中执行 SQL 查询通常不是提高性能的最佳解决方案。

还要尽量避免在循环中使用 $this->set() 。只是容易出错且难以调试。

© www.soinside.com 2019 - 2024. All rights reserved.