我是codeigniter框架的新手,并学习如何使用MVC模式。我正在努力实现输出,但这对我来说并不合适,请允许我用代码说明我的问题:
我的数据库中有3个表
CREATE TABLE carBrand
(
pk_brandID int,
brand varchar(255)
);
CREATE TABLE carModel
(
pk_modelID int,
model varchar(255)
)
CREATE TABLE brandModel
(
pk_brandmodelID int,
project varchar(255),
carOWner varchar(255),
buildyear varchar(255),
fk_brandID int,
fk_modelID int
)
目前我正在使用我的模型中的联接加入表格
function getCarbyOwner(){
$this->db->join('carBrand', 'carBrand.pk_brandID = brandModel.fk_brandID');
$this->db->join('carModel', 'carModel.pk_modelID = brandModel.fk_modelID');
$this->db->where('carOwner', $$this->session->userdata('logged_in_owner'));
$q = $this->db->get('brandModel');
return $q->result();
}
在我的视图中输出这个 - 取决于数据库中的第一个记录
品牌1
* model
品牌1
*型号品牌3
*型号品牌2
*型号品牌3
*模型
但我输出数据时遇到了困难 我基本上想要的是以下输出
品牌1
*模型
*模型
*模型品牌2
*模型
*模型
*模型品牌3
*模型
*模型
*模型
这是我的控制器
function index(){
if($car= $this->car_model->getCarbyOwner()){
$data['car'] = $car;
$this->load->view('carview', $car);
}
}
观点:
if(isset($car)){
foreach($car as $r){
$r->brand;
$r->model
}
}
如何实现我想要的结果?
我已经实施了一些建议,但现在它没有输出所有内容。
我在表brandModel中的记录就是这样的:
pk_brandmodelID | project | carowner | buildyear | fk_brandID | fk_modelID
1 | proj A | frank | 2012 | 1 | 6
2 | proj B | Jef | 2002 | 2 | 1
3 | proj C | jeffrey | 2013 | 1 | 5
4 | proj X | frank | 2010 | 2 | 2
5 | proj Y | george | 2008 | 1 | 3
让我们说品牌1 =奥迪,品牌2是梅赛德斯 想要的输出就像这样
奥迪
model fk_id 6
model fk_id 5
model fk_id 3梅赛德斯
model fk_id 1模型fk_id 2
但现在我只是
奥迪
model fk_id 6梅赛德斯
model fk_id 1
我使用了以下代码:
模型
function getCarbyOwner(){
$this->db->join('carBrand', 'carBrand.pk_brandID = brandModel.fk_brandID');
$this->db->join('carModel', 'carModel.pk_modelID = brandModel.fk_modelID');
$this->db->where('carOwner', 'xxx');
$q = $this->db->get('brandModel');
if($result = $q->result())
{
foreach($result as $key => $value)
{
$d[$value->pk_brandID]['brand'] = $value->brand;
$d[$value->pk_brandID]['data'][$value->pk_modelID] = $value;
}
return $d;
}
else
return false;
}
查看
if(isset($x)){
foreach($x as $r)
{
echo $r['brand']."<br />";
foreach($r['data'] as $v)
{
echo $v->model."<br />";
}
echo "<br />";
}
}
答案 0 :(得分:1)
将新方法设为CAR模态
function getCarModels(){
$modalData = array();
$this->db->join('carBrand', 'carBrand.pk_brandID = brandModel.fk_brandID');
$this->db->where('carOwner', $$this->session->userdata('logged_in_owner'));
$q = $this->db->get('brandModel');
if($result = $query->result())
{
foreach($result as $key => $value)
{
$modalData[$value-pk_brandID[] = $value;
}
}
return $brandData;
}
并进入控制器文件
$data['car'] = $this-car_modelgetCarModels();
并进入视图文件
foreach($car as $r)
{
echo $r[0]->brand."<br />";
foreach($r as $v)
{
echo $v->model."<br />";
}
echo "<br />";
}
答案 1 :(得分:0)
我认为最简单的方法是将结果集排序,在最后->where
之后添加类似的内容
$this->db->order_by("brandModel", "asc");
我不是CodeIgniter的专家,但这里的目标是将此附加到SQL语句中:
ORDER BY brand_name_col ASC, model_name_col ASC
然后,当价值与前一个值匹配时,只需要抑制“品牌”的显示。
答案 2 :(得分:0)
我只会使用2个表而不是3个这样的表:
CREATE TABLE carBrand
(
pk_brandID int,
brand varchar(255)
);
CREATE TABLE carModel
(
pk_modelID int,
fk_brandID int,
model varchar(255),
project varchar(255),
carOWner varchar(255),
buildyear varchar(255)
);
查询:
function getCarbyOwner($owner){
$q = $this->db->select('b.brand, m.model')
->from('carBrand b')
->join('carModel m', 'b.pk_brandID = m.fh_brandID')
->where('m.carOwner', $owner);
->group_by('b.brand')
->order_by('b.brand', 'ASC')
->get();
->result();
return $q;
}
控制器:
$owner = $this->session->userdata('logged_in_owner');
$data[cars] = $this->car_model->getCatbyOwner($owner);
$this->load->view('car_view', $data);
编辑: 3个表格查询:
function getCarbyOwner($owner){
$q = $this->db->select('b.brand, m.model, bm.carOwner')
->from('branModel bm')
->join('carModel m', 'm.pk_modelID = bm.fk_modelID')
->join('carBrand b', 'b.pk_brandID = bm.fk_brandID')
->where('bm.carOwner', $owner);
->group_by('b.brand')
->order_by('b.brand', 'ASC')
->get();
->result();
return $q;
}
尝试上述内容,如果它适合你,但只是为了让你知道,JOINS相当昂贵,至少比我的第一个建议更贵。
答案 3 :(得分:0)
你可以像斯宾塞所说的那样去做 - 这可能是最简单,最开销的做法......
或者您也可以将结果集分组为数组。这意味着您必须遍历控制器中的结果集并将相应的值放入正确的存储区中。
e.g。
array Cars
( 'Brand1', array(..),
'Brand2', array(..),
...
)
然后遍历UI中的嵌套循环。
答案 4 :(得分:0)
你正在迭代一系列汽车,回应每个品牌,然后是每个模型。即使您要将“order by”子句附加到您的sql,也不会改变它。
你需要按品牌分开汽车,就像dispake说的那样。
foreach($car as $r)
{
if($r->brand = "Brand 1")
{
$brand1[] = $r->model;
}
else if($r->brand = "Brand 2")
etc etc....
这将为您留下3个阵列,每个品牌一个,然后您可以随意输出。
答案 5 :(得分:0)
坦率地说,我同意 Matteo T。所说的。您的表似乎需要另外查看,因为我不认为这样的表之间的关系是有效的。无论如何,这是我的答案。
你当前的模型函数实际上并没有错,它只是没有正确排序。
<强>模型强>
function getCarbyOwner(){
$this->db->join('carBrand', 'carBrand.pk_brandID = brandModel.fk_brandID');
$this->db->join('carModel', 'carModel.pk_modelID = brandModel.fk_modelID');
$this->db->where('carOwner', 'frank'); // make sure the car owner is exists
$q = $this->db->get('brandModel');
if($result = $q->result())
{
foreach($result as $key => $value)
{
$d[$value->pk_brandID]['brand'] = $value->brand;
$d[$value->pk_brandID]['data'][$value->pk_modelID] = $value;
}
// test print_r($d); here to check the result
return $d;
}
else
return false;
}
查看强>
if(isset($x)){
foreach($x as $r)
{
// test print_r($r); here to check the result
echo $r['brand']."<br />";
foreach($r['data'] as $v)
{
// test print_r($v); here to check the result
echo $v->model."<br />";
}
echo "<br />";
}
}
基本上我们的想法是将标准结果集更改为更适合的数组列表,如 dispake 所示。
请注意我的答案只是一个样本。并且可能完全不适合您的要求。
<强> ADDED-EDITS 强>
我建议排序的主要思想是对结果集进行排序(大致类似于此)
array(
[0] => array (
brandModelID => 1,
project => 'proj A',
carowner => 'frank',
buildyear => 2012,
brandID => 1,
modelID => 6,
),
[1] => array (
brandModelID => 2,
project => 'proj B',
carowner => 'frank',
buildyear => 2002,
brandID => 2,
modelID => 1,
),
[2] => array (
brandModelID => 3,
project => 'proj C',
carowner => 'frank',
buildyear => 2013,
brandID => 1,
modelID => 5,
),
[3] => array (
brandModelID => 4,
project => 'proj X',
carowner => 'frank',
buildyear => 2010,
brandID => 2,
modelID => 2,
),
[4] => array (
brandModelID => 5,
project => 'proj Y',
carowner => 'frank',
buildyear => 2008,
brandID => 1,
modelID => 3,
)
到
array(
[1] => array( // key is brandID
['brand'] => 'something',
['data'] array(
[6] => array ( // key is modelID
brandModelID => 1,
project => 'proj A',
carowner => 'frank',
buildyear => 2012,
brandID => 1,
modelID => 6,
),
[2] => array ( // key is modelID
brandModelID => 3,
project => 'proj C',
carowner => 'frank',
buildyear => 2013,
brandID => 1,
modelID => 5,
),
[4] => array ( // key is modelID
brandModelID => 5,
project => 'proj Y',
carowner => 'frank',
buildyear => 2008,
brandID => 1,
modelID => 3,
)
)
),
[2] => array( // key is brandID
['brand'] => 'something',
['data'] array(
[1] => array ( // key is modelID
brandModelID => 2,
project => 'proj B',
carowner => 'frank',
buildyear => 2002,
brandID => 2,
modelID => 1,
),
[3] => array ( // key is modelID
brandModelID => 4,
project => 'proj X',
carowner => 'frank',
buildyear => 2010,
brandID => 2,
modelID => 2,
)
)
)
无论我怎么看,这个功能都很好看。代码没有任何问题。您只需要自定义要显示的内容和不显示的内容。尝试使用print_r()来检查结果。我标记了你可能需要检查的地方。