php - 在 Codeigniter、MysQL 中使用嵌套查询和 JOIN

标签 php mysql codeigniter join nested

我的 codeigniter 项目中有两个数据库表。作为简化摘要,

page                                        page_lang
-------------------------------------       ----------------------------
id_page | id_menu | id_parent | level       id_page |  title     | etc..
-------------------------------------       ----------------------------
   1    |    1    |     0     |   0            1    | Name 1     | etc..
   2    |    1    |     1     |   1            2    | Name 1.1   | etc..
   3    |    1    |     2     |   2            3    | Name 1.1.1 | etc..
   4    |    1    |     2     |   1            4    | Name 1.2   | etc.

我正在尝试创建一个下拉选择框,其中包含嵌套有缩进的所有页面作为输出;

<option value="id_page">Name 1</option>
<option value="id_page">&nbsp;»&nbsp;Name 1.1</option>
<option value="id_page">&nbsp;&nbsp;&nbsp;-&nbsp;Name 1.1.1</option>
<option value="id_page">&nbsp;»&nbsp;Name 1.2</option>

在这种情况下,我想需要加入 page 和 page_lang 并创建一个递归循环。

但我致力于设计最快的代码。感谢您的帮助。

最佳答案

你的递归函数看起来像这样

function recursivePageOptions( $level, $nodes ) {
  $set = array();
  foreach ($nodes as $node) {
    $nest = '';
    for($x=1; $x<=$level; $x++)
      $nest.= ' &nbsp;';
    $page = '<option value="'.$node['page']['id'].'">';
    $page.= $nest . $node['page']['title'] . '</option>';
    $set[] = $page;
    if (isset($node['children'])) {
      $set = array_merge(
        $set,
        recursivePageOptions( $level+1, $node['children'] );
      );
    }
  }
  return $set;
}

因此,在调用此递归函数之前,您需要做的是将您的页面信息放入如下所示的数组结构中:

[
  'My Homepage' => [
    'page' => ['My Homepage', 24, ... ],
    'children' => [
      'Level 1 Page' => [
        'page' => ['Level 1 Page', 39, ... ],
        'children' => [
          'Level 2 Page' => [
            'page' = ['Level 2 Page', 51, ... ]
          ]
        ]
      ],
      'Another Level 1 Page' =< [
        'page' => ['Another Level 1 Page', 56, ... ]
      ]
    ]
  ]
]

这部分的细节由您来决定,本质上您将从数据库中获取行并以生成上述数组结构的方式循环遍历它们。

关于php - 在 Codeigniter、MysQL 中使用嵌套查询和 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9410982/

相关文章:

javascript - 主干滚动事件未触发

php - 为什么我无法在 Codeigniter 中读取带有中文字符的输入值?

javascript - 跟踪链接到我的 iframe/widget 的 URL

php - MySQL 在 CodeIgniter 中两次连接同一个表中的两个不同列

php - 在 CodeIgniter 中上传多个文件

php - 从两个 mysql 表中选择的 mysql 查询

php - 选择数据库,获取某列的所有最大值

php - 如何在 Laravel 上获取带有标签的所有缓存条目

php - "Get"函数不起作用,因为不是所有的连字符都应该被替换

php - MySQL 或 PHP 错误? IPV6