【问题标题】:Codeigniter 4 query builder join display only 1 time from first tableCodeigniter 4 查询构建器连接仅从第一个表显示 1 次
【发布时间】:2020-08-14 18:52:07
【问题描述】:

我已经使用连接完成了一个查询构建器。我想根据表 1 上的用户 ID 显示表 2、3、4、5、6 等。我尝试查询结果,它显示如下:

我的桌子

Table users

user_id | username | email          
1       | userA    | userA@email.com
2       | userB    | userB@gmail.com
                                                         
Table add_game
game_id | user_id | ign    | acc_id
1       | 1       | ignA   | accA
2       | 1       | ignB   | accB
1       | 2       | ignB   | accB
3       | 2       | ignD   | accD 

我将使用 foreach 循环,我相信它会根据数据库中的记录多次显示。如果我只想显示1次红色框中突出显示的信息(来自users表)以及add_game表中与user id关联的所有记录,该怎么办?

这是我当前的代码:

控制器

public function login()
    {

        $data = [];
        helper(['form']);
        
        $validation =  \Config\Services::validation();

        $db = db_connect();
        $model = new LoginModel($db);
        $user = $model->login($this->request->getVar('userlogin'));

        $this->setUserSession($user[0]);
        
            echo view('templates/header', $data, $user);
            echo view('account/login', $data, $user);
            echo view('templates/footer', $data, $user);
        
        
    }


    private function setUserSession($user){
        $data = [
            'user_id' => $user['user_id'],
            'username' => $user['username'],
            'email' => $user['email'],
            'firstname' => $user['firstname'],
            'lastname' => $user['lastname'],
            'dob' => $user['dob'],
            'country' => $user['country'],
            'country_code' => $user['c_code'],
            'contact' => $user['contact'],
            'game_id' => $user['game_id'],
            'ign' => $user['ign'],
            'acc_id' => $user['acc_id'],
            'isLoggedIn' => true
        ];
        
        session()->set($data);
        return true;
    }

型号:

return $this->db->table('users')
                        ->groupStart()
                            ->where('username', $str)
                            ->orWhere('email', $str)
                        ->groupEnd()
                        ->join('add_game', 'add_game.user_id = users.user_id')
                        ->get()
                        ->getResultArray();

我还有几张桌子,但现在还没有创建,所以我暂时只加入了一张桌子。我错过了什么?还是我必须循环两次?有没有一种方法我只需要循环 1 次?希望有人可以在这里帮助我。提前谢谢各位!

【问题讨论】:

  • 请添加表结构,这是一个独立的新问题,人们不知道结构
  • @Vickel 我已添加。很抱歉,因为这是几天前发布的并且没有得到任何帮助=(我已经更新了表结构
  • 使用->group_by('users.user_id')
  • @Vickel 我已经尝试过了,但它只返回来自用户和 add_game 表的 1 条记录。如果假设我的 add_game 表有 2 条记录,我想显示 add_game 表中的 2 条记录和 users 表中的 1 条记录,而不是为 users 表复制 2 次。
  • 我也尝试过 distinct,但仍然没有达到我想要的效果。

标签: php codeigniter-4 codeigniter-query-builder


【解决方案1】:

实现这一点的最简单方法(显示 add_game 表中的 2 条记录和 users 表中的 1 条记录)您需要在视图中创建一个 foreach 循环,并从要显示的 users 表中排除重复数据。

控制器:

$data['my_data']=$this->Your_model->your_method(); // your query example
$this->load->view('your_view',$data)

查看:

<?php $my_id=0;foreach($my_data as $row):?>
   <?php if($my_id!=$row->user_id):?>
     <div><?=$row->username?></div>   <!--data from table user-->
     <div><?=$row->created_at?></div> <!--data from table add_game-->
   <?php else:?>
     <div><?=$row->created_at?></div> <!--only data from table add_game-->
   <?php endif;?>
<?php $my_id=$row->user_id;endforeach;?>

【讨论】:

  • 我已经更新了问题中的代码。我尝试使用您的方法,但是当我尝试 print_r($user) 时收到一条错误消息,它显示:未定义变量:用户
  • 您在哪里看到错误?在这一行:$user = $model-&gt;login($this-&gt;request-&gt;getVar('userlogin'));?
  • 这一行:foreach($user as $row): in my view file
  • 现在你必须一步一步地回去调试,直到你找到 $user 未定义的原因。您可以使用 print_r($vat);die;因为这会停止代码,您可以在视图或浏览器的网络选项卡中看到您拥有的内容。一旦你修复它,你会看到我的例子可以正常工作......
  • 什么是增值税?显然我有同样的错误信息 $vat is undefined too
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多