0

我已经阅读了几篇非常接近我要问的问题的帖子,但我仍然没有掌握 MVC 方式。一个例子很接近,标题为“Codeigniter db query on two tables”,但我得到了“Undefined property”错误,这强化了我没有正确调用对象的事实。我宁愿不使用 DataMapper,因为如果我需要出去学习其他课程,那么我可能会回到程序编码路线。我对了解这个框架实现的工作原理感到有点兴奋。

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

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

我的目标是对应用程序表使用 select 语句,然后从该表中打印出我想要的每一列:例如,我目前在我的“应用程序”表中定义了两个应用程序,其中一个应用程序有两个反向代理映射,另一个有一个。来自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() 上使用返回函数吗?即便如此,如何在名为 int he views page 的代码中为 $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)函数?该功能为我工作的唯一方法是在遍历行时提供应用程序行的 id。

我试着把 $this->prp_model->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 ?>
4

1 回答 1

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() 函数。我也有兴趣学习其他方法来做到这一点。

于 2013-12-21T13:47:36.093 回答