简体   繁体   English

PHP - 递归地从SQL数据库获取数据

[英]PHP - Get data from SQL database recursively

I have 2 tables tl_docs_categories which are the parent table for tl_docs. 我有2个表tl_docs_categories,它们是tl_docs的父表。 Structure of tables is: 表的结构是:

tl_docs_categories
[
   id,
   category_name,
   pid (give the posibility to create subcategories / pid = tl_docs_categories.id if have subcategory)
]
tl_docs
[
   id,
   doc_name,
   doc_url,
   pid(id for category)
]

So I have something like this in my database: 所以我的数据库中有这样的东西:

在此输入图像描述

What I want is to return all result when I select category which is in red, I want to return all documents and subcategories names, in my view I use a select form to return the id of selected parent category in red. 我想要的是当我选择红色类别时返回所有结果,我想返回所有文档和子类别名称,在我的视图中我使用选择表单以红色返回所选父类别的ID。

Here is my php function : 这是我的php函数:

public function checkSQL($id)
{
    if(!empty($id))
    {
        /* SQL CHECK IF HAVE DOCS */
        $sqlDoc = "SELECT category_name, doc_name, doc_url FROM tl_docs_categories dc
                   LEFT JOIN tl_docs d ON dc.id = d.pid WHERE d.pid = " . $id;
        $objDocs = Database::getInstance()->query($sqlDoc);
        if ($objDocs->numRows == 0)
        {
            /* SQL CHECK IF HAVE CHILD */
            $sqlChild = "SELECT dc.id, category_name, doc_name, doc_url FROM tl_docs_categories dc
                         LEFT JOIN tl_docs d ON dc.id = d.pid WHERE dc.pid =" . $id;
            $objDocs = Database::getInstance()->query($sqlChild);
                return $objDocs;
            }
        }
        else
        {
            return $objDocs;
        }
    }
}

I'm a bit lost and I don't have a solution to do it recursively and return datas for each category, subcategory, subsubcategory and more then. 我有点失落,我没有解决方案来递归地执行它并返回每个类别,子类别,subsubcategory等的数据。

Thank you for your help in advance. 提前谢谢你的帮助。

I'm not sure about the syntax, but the idea is to call checkSQL on each level, if you want to return all results, then you have to adapt the $objDocs var to be an array. 我不确定语法,但想法是在每个级别调用checkSQL ,如果要返回所有结果,则必须使$objDocs var适应为数组。

public function checkSQL($id)
{
    if(!empty($id))
    {
        /* SQL CHECK IF HAVE DOCS */
        $sqlDoc = "SELECT category_name, doc_name, doc_url FROM tl_docs_categories dc
                   LEFT JOIN tl_docs d ON dc.id = d.pid WHERE d.pid = " . $id;
        $objDocs = Database::getInstance()->query($sqlDoc);

        if ($objDocs->numRows > 0) {
            foreach ($objDocs->fetchColumn() as $row) {
                $objDocs = $this->checkSQL($row->id);
            }
        }

        return $objDocs;
    }

    return null;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM