1

我是 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

*模型

品牌 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 是梅赛德斯 想要的输出是这样的

奥迪
模型 fk_id 6
模型 fk_id 5
模型 fk_id 3

梅赛德斯
车型 fk_id 1

型号 fk_id 2

但现在我只得到

奥迪
车型 fk_id 6

梅赛德斯
车型 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 />";
    }
}
4

6 回答 6

1

将新方法转化为 CAR modal

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 />";
        }
于 2013-07-25T11:28:10.830 回答
0

我认为让结果集排序是最容易的,在最后一个之后添加类似这样的内容->where

$this->db->order_by("brandModel", "asc");

我不是 CodeIgniter 方面的专家,但这里的目标是将其附加到 SQL 语句中:

ORDER BY brand_name_col ASC, model_name_col ASC

那么当值与前面的值匹配时,就只是抑制“品牌”的显示。

于 2013-07-24T19:31:45.590 回答
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 相当昂贵,至少比我的第一个建议贵。

于 2013-07-24T20:25:45.203 回答
0

您可以按照 Spencer 所说的方式进行操作——这可能是最简单、开销最小的方法……

或者,您也可以将结果集分组为一个数组数组。这意味着您必须遍历控制器中的结果集并将相应的值放入正确的存储桶中。

例如

 array Cars
     ( 'Brand1', array(..),
       'Brand2', array(..),
     ...
     )

然后遍历 UI 中的嵌套循环。

于 2013-07-24T20:30:41.137 回答
0

您正在遍历一系列汽车,呼应每个品牌,然后是每个型号。即使您要在 sql 中附加“order by”子句,它也不会改变这一点。

您需要按品牌将汽车分开,就像 dispake 说的那样。

foreach($car as $r)
        {
        if($r->brand = "Brand 1")
        {
            $brand1[] = $r->model;
        }
        else if($r->brand = "Brand 2")
        etc etc.... 

这将为您留下 3 个数组,每个品牌一个,然后您可以随意输出。

于 2013-07-24T21:40:42.527 回答
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所建议的那样。

请注意,我的回答只是一个示例。并且可能不完全符合您的要求。

附加编辑

我建议的排序的主要思想是对结果集进行排序(大致像这样)

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() 检查结果。我标记了您可能需要检查的地方。

于 2013-07-24T22:17:10.950 回答