Codeigniter在两个表上调用嵌套循环的1-many db查询

时间:2013-10-27 23:40:27

标签: mysql codeigniter

我已经阅读了几篇与我即将提出的问题非常接近的帖子,但我仍然没有抓住MVC的方式。一个例子是关闭并标题为“两个表上的Codeigniter数据库查询”,但我得到了“未定义属性”错误,这加强了我没有正确调用对象的事实。我宁愿不使用DataMapper只是因为如果我需要出去获得额外的类,那么我可能会回到程序编码路径。我对理解这个框架实现是如何工作感到有点兴奋。

我有两个表,让我们调用一个“apps”,另一个是“映射”。 “应用程序”是使用apache作为反向代理配置的应用程序,如下所示: ProxyPass / mapping / https:/// ProxyPassReverse / mapping / https:///

有些应用程序可以请求多个反向代理映射,因此它是1-many设计。

我的目标是为apps表使用select语句,然后从该表中打印出我想要的每一列: 例如,我目前在我的“apps”表中定义了两个应用程序,其中一个应用程序有两个反向代理映射,另一个有一个。来自apps表的数据下方的prxypass行将来自apps_mapping表。

App: App ABC
Owner: ABC Team
Date Requested: 2013-10-27
ProxyPass /ABC-Resource/ https://<to-some-internal-URL>/
ProxyPassReverse /ABC-resource/ https://<to-some-internal-URL>/

App: App XYZ
Owner: XYZ Team
Date Requested: 2013-10-27
ProxyPass /XYZ-mapping/ https://<to-some-internal-URL>/
ProxyPassReverse /XYZ-mapping/ https://<to-some-internal-URL2>/
ProxyPass /anothermapp/ https://<to-some-internal-URL>/
ProxyPassReverse /anothermapping/ https://<to-some-internal-URL2>/

我试图通过在user_guide中修改CodeIgniter示例提供的教程来模拟我第一次使用CodeIgniter的尝试。

现在我有什么。 型号类:

<?php
class Prp_model extends CI_Model {


        public function __construct()
        {
                $this->load->database();
        }

//GET APP THE ROWs FROM THE apps TABLE
        public function get_appsUsingPrp()
        {
                $query = $this->db->get('apps');
                return $query->result_array();

        }

//GET THE MAPPINGS FROM THE apps_mappings TABLE
//FOR EACH APP BY WAY OF UNIQUE id IN THE appsTABLE
        public function get_prpMappings($id = FALSE)
        {
                $query = $this->db->get_where('apps_mappings', array('resourceID' => $id));
                return $query->result_array();
        }
?>

对于上面的类,我应该将它放在变量中而不是在get_prpMappings()上使用return函数吗?即便如此,如何为名为int的代码中的$ id提供一个值?查看页面?

控制器类

<?php
class Prp extends CI_Controller {

        public function __construct()
        {
                parent::__construct();
                $this->load->model('prp_model');
        }

        public function index()
        {
                $data['apps'] = $this->prp_model->get_prp();
                $data['mappings'] = $this->prp_model->get_prpMappings($id);
                $data['title'] = 'PRP archive';
                $this->load->view('templates/header', $data);
                $this->load->view('prp/index', $data);
                $this->load->view('templates/footer');

        }

        public function view($id)
        {
                $data['apps'] = $this->prp_model->get_prp();
                $data['mappings'] = $this->prp_model->get_prpMappings($id);
        }


}

查看

<?php
    print_r($apps);
    print_r($mappings);

    foreach ($apps as $details): ?>

        <div id="main">
            <ul>
             <?php echo "<li>App Name: ".$details['app_name'] ?>
             <?php echo "<li>EPRID: ".$details['EPRID'] ?>
             <?php echo "<li>Requestor: ".$details['requestor'] ?>
             <?php echo "<li>Team PDL: ".$details['PDL'] ?>

                    <?php foreach ($mappings as $map): ?>
                    <?php echo "<li>ProxyPass /".$map['resource']."/ ".$map['destURL'] ?>
            <?php echo "<li>ProxyPassReverse /".$map['resource']."/ ".$map['destURL'] ?>
                    <?php endforeach ?>

            </ul>

        </div>
        <hr />




<?php endforeach ?>

?>

归结为我的困惑....如果我不打算设置DataMapper类,我是否应该在模型和/或控制器类中进行所有foreach循环?

有没有办法直接在视图中调用模型类中定义的get_prpMappings($ id)函数?该函数对我有用的唯一方法是在迭代行时提供app行的id。

我尝试将$ this-&gt; prp_model-&gt; get_prpMappings($ id);在视图中,但视图页面似乎没有标识该类。

最后......从它的外观来看,似乎我将使用框架(例如CodeIgniter或Zend)进行更多编码,然后就是从头开始编写所有内容。但我的印象是框架是为了提供额外编码的便利。我只是没有看到它。请帮忙。

已更新!我希望我理解这一点。

我修改了逻辑以表达所需的输出。你能告诉我它是否效率低下吗?这是逻辑: 模特课程:

<?php
class Prp_model extends CI_Model {


        public function __construct()
        {
                $this->load->database();
        }

//GET APP THE ROWs FROM THE sharedITG TABLE
        public function get_appsUsingPrp()
        {
                $query = $this->db->get('sharedITG');
                return $query->result_array();

        }

//GET THE MAPPINGS FROM THE sharedITG_mappings TABLE
//FOR EACH APP BY WAY OF UNIQUE id IN THE shareITG TABLE
        public function get_prpMappings($id = FALSE)
        {
                $this->db->select('resourceID, resource, destURL');
                $query = $this->db->get_where('sharedITG_mappings', array('resourceID' => $id));
                return $query->result_array();
        }

        public function get_prp()
        {

                //loop through all apps
                foreach ($this->get_appsUsingPrp() as $app)
                {
                        //print_r($app);
                        foreach ($this->get_prpMappings($app['id']) as $mappings)
                        {
                                 $map[] = $mappings;
                        }

                }
                return $map;
        }
}

控制器类

<?php
class Prp extends CI_Controller {

        public function __construct()
        {
                parent::__construct();
                $this->load->model('prp_model');
        }

        public function index()
        {
                $data['mappings'] = $this->prp_model->get_prp();
                $data['apps'] = $this->prp_model->get_appsUsingPrp();
                $data['title'] = 'PRP archive';
                $this->load->view('templates/header', $data);
                $this->load->view('prp/index', $data);
                $this->load->view('templates/footer');

        }

        public function view($id)
        {
                $data['apps'] = $this->prp_model->get_appsUsingPrp();
                $data['mappings'] = $this->prp_model->get_prp();

        }

}

查看代码:

<?php
//print_r($apps);
//print_r($mappings);

foreach ($apps as $details): ?>

    <div id="main">
        <ul>
         <?php echo "<li>App Name: ".$details['app_name'] ?>
         <?php echo "<li>EPRID: ".$details['EPRID'] ?>
         <?php echo "<li>Requestor: ".$details['requestor'] ?>
         <?php echo "<li>Team PDL: ".$details['PDL'] ?>

        <?php
                foreach ($mappings as $map)
                {
                        if ($details['id'] == $map['resourceID'])
                        {
                                echo "<li>ProxyPass /".$map['resource']."/ ".$map['destURL'];
                                echo "<li>ProxyPassReverse /".$map['resource']."/ ".$map['destURL'];
                        }
                }

        ?>
        </ul>

    </div>
<hr />

<?php endforeach ?>

1 个答案:

答案 0 :(得分:1)

经过进一步的研究,我发现了一个论坛,给了我一个相当不错的例子。我不确定它是否是最佳方式,但它对我有用,并且仍然(有点)维护了Code igniter的MVC模型。以下函数中的foreach就是我添加的内容。它似乎循环遍历当前结果并获得第二个表中具有Table2ID和IDFromTable之间关系的所有行。然后通过$ result {$ key}添加结果。

public function get_resuts()
    {

            $query = $this->db->get('table1');

            $result = $query->result_array();

            foreach ( $result as $key => $row )
            {

                    $query = $this->db->get_where('Table2', array('Table2ID' => $row['IDFromTable']));
                    $row['DesiredFieldFromTable@'] = $query->result_array();
                    $result[$key] = $row;
            }

            return $result;
    }

然后在视图中通过使用foreach中的内容循环遍历第二个数组得到get_resuts()函数。我也有兴趣了解其他方法。