gpt4 book ai didi

mysql - Codeigniter 对两个需要嵌套循环的表进行 1-many db 查询

转载 作者:行者123 更新时间:2023-11-29 13:29:54 25 4
gpt4 key购买 nike

我读过几篇文章,它们与我要问的问题非常接近,但我仍然没有掌握 MVC 方式。一个示例很接近,标题为“两个表上的 Codeigniter db 查询”,但我收到“未定义的属性”错误,这强化了我没有正确调用对象的事实。我宁愿不使用 DataMapper,因为如果我需要出去获取额外的类,那么我可能会回到程序编码路线。我对了解这个框架实现的工作原理感到有点兴奋。

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

一些应用程序可能会请求多个反向代理映射,因此它是一对多的设计。

我的目标是对 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>/

我尝试通过修改用户指南中 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 view page 的代码中为 $id 提供一个值?

Controller 类

<?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 类,我是否应该在模型和/或 Controller 类中执行所有 foreach 循环?

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

我尝试将 $this->prp_model->get_prpMappings($id);在 View 中,但 View 页面似乎没有识别该类。

最后.. 从表面上看,我似乎会使用框架(例如 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;
}
}

Controller 类

<?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 ?>

最佳答案

经过进一步研究,我找到了一个论坛,它给了我一个相当不错的例子。我不确定这是否是执行此操作的最佳方法,但它对我有用,并且仍然(某种程度上)维护了 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;
}

然后,通过使用 get_resuts() 函数中 foreach 结果的内容循环遍历第二个数组,即可在 View 中使用它。我也有兴趣学习其他方法来做到这一点。

关于mysql - Codeigniter 对两个需要嵌套循环的表进行 1-many db 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19625056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com