我已经阅读了几篇与我即将提出的问题非常接近的帖子,但我仍然没有抓住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 ?>
答案 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()函数。我也有兴趣了解其他方法。