如何在输出中只有一次标题对连接表进行排序

时间:2013-07-24 19:19:05

标签: php mysql codeigniter

我是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 />";
    }
}

6 个答案:

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