【问题标题】:Codeigniter: Join not working with columns same name and idCodeigniter:加入不使用相同名称和 ID 的列
【发布时间】:2016-09-20 09:21:24
【问题描述】:

我希望能够将两个表连接在一起。

因为我的 论坛表column "name" 和我的 forum_categories column "name"

我无法同时显示这两个名字。

在我的 select() 上,如果我使用 $this->db->select('f.name, fc.name', false);,它只会显示来自 forum_categories 的名称

array(1) { [0]=> array(1) { ["name"]=> string(17) "News & Discussion" } }

问题我怎样才能让两个名称都显示在两个列中 表格。

注意:我只想在我的 foreach 循环中使用$result['name']

所以我希望它是输出

General

News & Discussion

Lounge

我看过

CodeIgniter ActiveRecord field names in JOIN statement

codeigniter - select from 2 tables with same column name

模型

public function get_forums() {
    $this->db->select('f.name, fc.name', false);
    $this->db->from('forum as f');

    // tried $this->db->join('forum_categories as fc', 'fc.forum_id = f.forum_id');

    $this->db->join('forum_categories as fc', 'fc.forum_categories_id = f.forum_id');
    $query = $this->db->get();

    if ($query->num_rows() > 0) {
        return $query->result_array();
    } else {
        return false;
    }
}

控制器

<?php

class Forums extends MY_Controller {

    public function __construct() {
        parent::__construct();
    }

    public function index() {

        $data['label'] = '';

        $data['forums'] = array();

        $results = $this->get_forums();

        var_dump($results);

        if (isset($results)) {
            foreach ($results as $result) {

                $data['forums'][] = array(

                    'name' => $result['name'], // Only want to use single variable.

                );
            }
        }

        $data['header'] = Modules::run('admin/common/header/index');
        $data['footer'] = Modules::run('admin/common/footer/index');

        $this->load->view('template/forum/list_forum_view', $data);
    }

    public function get_forums() {
        $this->db->select('f.name, fc.name', false);
        $this->db->from('forum as f');
        $this->db->join('forum_categories as fc', 'fc.forum_categories_id = f.forum_id');
        $query = $this->db->get();

        if ($query->num_rows() > 0) {
            return $query->result_array();
        } else {
            return false;
        }
    }
}

更新

下面的代码中可以正常工作,但宁愿只使用大量的 join()

public function get_forums() {
    $this->db->select("*");
    $this->db->from('forum');
    $query = $this->db->get();

    foreach ($query->result_array() as $f) {
        $data[] = array(
            'name' => $f['name']
        );

        $this->db->select("*");
        $this->db->from('forum_categories');
        $query = $this->db->get();

        foreach ($query->result_array() as $fc) {
            $data[] = array(
                'name' => $fc['name']
            );
        }

    }

    return $data;
}

【问题讨论】:

  • 你可以在查询执行后直接echo $this-&gt;db-&gt;last_query(); 并尝试直接执行到 phpmyadmin 看看它给出了什么
  • @Zeeshan SELECT f.name, fc.name FROM forum` as f JOIN forum_categories as fc ON fc.forum_categories_id = f.`forum_id``
  • 你试过在phpmyadmin执行它

标签: php codeigniter


【解决方案1】:

试试这个,它会工作的。

    public function get_forums() {
    $this->db->select('f.name as forum_name, fc.name as forum_categories_name', false);
    $this->db->from('forum f');

    // tried $this->db->join('forum_categories fc', 'fc.forum_id = f.forum_id');

    $this->db->join('forum_categories fc', 'fc.forum_categories_id = f.forum_id');
    $query = $this->db->get();

    if ($query->num_rows() > 0) {
        return $query->result_array();
    } else {
        return false;
    }
}

【讨论】:

  • 现在在我的控制器上的阵列上显示错误消息:未定义的索引:名称
  • 如果我在选择中使用 have fc.name 将只显示来自 forum_categories 的名称
  • 我只想用“名”字一个字搞定
  • @wolfgang1983 您不能使用相同的索引同时获取两个属性。如果你正在做一些有命中的事情,但是你可以将两列连接在一起成为你想要的东西,如here
【解决方案2】:

根据我在您更新的问题中看到的内容。你需要的是UNION 而不是JOIN。您可以在使用 UNION 连接之前使用 get_compiled_select() 构建两个查询。

public function get_forums() {
    $forum = $this->db->select('name')->get_compiled_select('forum');
    $forum_categories = $this->db->select('name')->get_compiled_select('forum_categories');

    $query = $this->db->query($forum.' UNION '.$forum_categories);

    if ($query->num_rows() > 0) {
        return $query->result_array();
    } else {
        return false;
    }
}

【讨论】:

    【解决方案3】:

    简单地使用

    作为

    关键字,因为当您尝试打印它时,该 AS 关键字会为您的列提供可选名称。

    这里我有两个具有相同列名“name”的表,所以我用 AS 关键字更改了它们。

    例如:

    $this->db->select('tbl_category.id_category,tbl_category.name AS cat_name,
                         tbl_subject.id_subject,tbl_subject.name AS sub_name');
    

    结果

    Array ( [0] => Array ( [id_category] => 9 [cat_name] => OL [id_subject] => 13 [sub_name] => Science )
    

    所以这是SQL语言的简单解决方案

    【讨论】:

      猜你喜欢
      • 2018-04-05
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多