使用JOIN选择单行的codeigniter错误

时间:2013-06-08 05:19:48

标签: codeigniter

我在选择单行时尝试连接工作。这是我的代码:

模型:

          function view($id) {
            $this->db->select('c.name
                                ,c.phone
                                ,c.active
                                ,c.website
                                ,c.date_acquired
                                ,con.firstName');
            $this->db->from('company c');
            $this->db->join('contacts con','c.primary_contact = con.id','left');
            $this->db->where('id', $id);
            $query = $this->db->get();
            return $query->row_array();

控制器:

public function view($id)
{

    $this->load->model('Company_model');
    $data['data']= $this->Company_model->view($id);
    $this->load->view('templates/header');
    $this->load->view('company/view', $data);
    $this->load->view('templates/footer');

}

我得到的错误是:

  

致命错误:在非对象中调用成员函数row_array()   /home/techf/public_html/application/models/company_model.php上线   35

上面代码中的

和第35行是:

$query = $this->db->get()

在处理连接和行数组时这是不正确的吗?

**

编辑1

**:

这是我的控制器:

public function view($id)
{

    $this->load->model('Company_model');
    $data = $this->Company_model->view($id)->row();
    $this->load->view('templates/header');
    $this->load->view('company/view', $data);
    $this->load->view('templates/footer');

}

和我的模特:

function view($id) {
            $this->db->select('*');
            $this->db->from('company');
            $this->db->join('contacts con','c.primary_contact = con.id','left');
            $this->db->where('id', $id);
            return $this->db->get('company');
 }

但现在我收到了错误:

  

致命错误:调用非对象中的成员函数row()   第21行/home/techf/public_html/application/controllers/company.php

3 个答案:

答案 0 :(得分:0)

在这里你去模型代码

        public function get_joins($table,$value,$joins,$where,$order_by,$order)
    {
        $this->db->select($value);
         if (is_array($joins) && count($joins) > 0)
          {
             foreach($joins as $k => $v)
               {
                $this->db->join($v['table'], $v['condition'], $v['jointype']);
               }
          }
         $this->db->order_by($order_by,$order);
         $this->db->where($where);
        return $this->db->get($table);
     }




    and in your controller aceess it like

   $value=('restaurantorders.*,restaurant.Name,restaurant.CurrencyId,currency.*,orderpaymentdetail.Gateway ');
        $joins = array
        (
                  array
                (
                  'table' => 'tk_restaurant',
                  'condition' => 'restaurant.Id = restaurantorders.RestaurantId',
                  'jointype' => 'inner'
                 ),
                  array
                (
                  'table' => 'tk_currency',
                  'condition' => 'restaurant.CurrencyId = currency.Id',
                  'jointype' => 'inner'
                 ),
                   array
                (
                  'table' => 'tk_orderpaymentdetail',
                  'condition' => 'restaurantorders.Id = orderpaymentdetail.OrderId',
                  'jointype' => 'inner'
                 ),
        );

        $data['order_detail'] = $this->general_model->get_joins($data['tbl'],$value,$joins,array('OrderStatus'=>'Confirm','restaurantorders.Id'=>$orderid),'restaurantorders.Id','desc')->row();

public function get_joins($table,$value,$joins,$where,$order_by,$order) { $this->db->select($value); if (is_array($joins) && count($joins) > 0) { foreach($joins as $k => $v) { $this->db->join($v['table'], $v['condition'], $v['jointype']); } } $this->db->order_by($order_by,$order); $this->db->where($where); return $this->db->get($table); } and in your controller aceess it like $value=('restaurantorders.*,restaurant.Name,restaurant.CurrencyId,currency.*,orderpaymentdetail.Gateway '); $joins = array ( array ( 'table' => 'tk_restaurant', 'condition' => 'restaurant.Id = restaurantorders.RestaurantId', 'jointype' => 'inner' ), array ( 'table' => 'tk_currency', 'condition' => 'restaurant.CurrencyId = currency.Id', 'jointype' => 'inner' ), array ( 'table' => 'tk_orderpaymentdetail', 'condition' => 'restaurantorders.Id = orderpaymentdetail.OrderId', 'jointype' => 'inner' ), ); $data['order_detail'] = $this->general_model->get_joins($data['tbl'],$value,$joins,array('OrderStatus'=>'Confirm','restaurantorders.Id'=>$orderid),'restaurantorders.Id','desc')->row();

答案 1 :(得分:0)

注意在模型i上首先测试num_rows()是否大于1,然后发送row,如果不返回false

注意this->db->get上删除了表名,因为您已经在from方法中添加了该名称。

        $this->db->select('*')
                ->from('company c');
                ->join('contacts con','c.primary_contact = con.id','left');
                ->where('id', $id);
        $query = $this->db->get();
        return $query->num_rows() >= 1 ? $query->row() : FALSE;
COntroller 上的

在您忘记添加data的{​​{1}}变量上,当您访问您查看的变量/对象时,将使用此变量,例如key

$data['contacts']
VIEWS 上的

访问您之前分配给您的public function view($id) { $this->load->model('Company_model'); $data['contacts'] = $this->Company_model->view($id); $this->load->view('templates/header'); $this->load->view('company/view', $data); $this->load->view('templates/footer'); } 密钥。

contacts

显示标准MySQL查询的查询结构

您可以在您的模型上注释<? if(!empty($contacts)) { print_r($contacts); }else{ echo 'No data'; } ?> 并在return方法之后添加此代码段。

$this->db->get()

这将回显查询的内容,您可以在echo $this->db->last_query(); die(); 上运行它,并比较返回的值是否正确。

答案 2 :(得分:0)

你可以这样试试吗?

模型:(我不确定哪个表是id,哪个是primary_contact,所以如果我犯了错误就改变它)

function view($id) {
    $this->db->join('contacts','company.primary_contact = contacts.id','left')
        ->where('id', $id);
    $query = $this->db->get('company');
    return $query->row();
}

在控制器中调用它:

$data['result'] = $this->company_model->view($id);

然后在视图中访问对象:

<?=$result->id?> (etc.)