如何使用Codeigniter 4连接两个不同数据库的表

kwvwclae  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(147)

我尝试使用codeigniter 4连接两个具有不同数据库的表。我已经使用$db1和$db2声明了不同的数据库。我的问题是当我尝试连接时,它显示错误“Table 'db2.student' doesn't exist”。但我尝试通过在'db2'上运行一个简单的查询来测试这一点,而没有连接,结果是确定的。
我的第一个项目,表'attendance'和'student'在同一个数据库'$db1'中,数据显示正确连接。
在第二个项目中,我尝试将表'student'移动到db2($db2)并尝试进行连接,但错误显示“Table 'db2.student' doesn't exist”。
数据库$db1和$db2在同一台服务器上(我的本地主机)。
我的控制器(JoinController.php)

<?php
namespace App\Controllers;
use CodeIgniter\Controller;

class JoinController extends Controller
{
    public function index()
{
    // Load the databases
    $db1 = \Config\Database::connect('db1');
    $db2 = \Config\Database::connect('db2');

    // Load the model
    $model = new \App\Models\JoinModel($db1, $db2);

    // Get the joined result from the model
    $data['result'] = $model->getJoinedData();

    // Load the view with the data
    return view('join_view', $data);
    }
 }

字符串
我的模型(JoinModel.php)

<?php
namespace App\Models;

use CodeIgniter\Model;

class JoinModel extends Model
{
    protected $db1;
    protected $db2;

    public function __construct($db1, $db2)
    {
        // Set the databases
        $this->db1 = $db1;
        $this->db2 = $db2;
    }

    public function getJoinedData()
    {
        // Perform the join
        $query = $this->db1->table('attendance as k')
                ->select('k.id, k.time_in, k.time_out, s.student_name, s.programme')
                ->join('db2.student as s', 'k.id= s.id')
                ->get();

        // Get the result
        return $query->getResult();

        // Example query to test the connection to db2
        // $query = $this->db2->table('student')->get();
        // return $query->getResult();

        // var_dump($query);
    }
}


我的视图(join_view.php)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Joined Data</title>
</head>
<body>
    <h1>Joined Data</h1>

    <table border="1">
        <tr>
            <th>Column 1</th>
            <th>Column 2</th>
            <th>Column 3</th>
            <!-- Add more table headers as needed -->
        </tr>
        <?php foreach ($result as $row): ?>
            <tr>
                <td><?= $row->id ?></td>
                <td><?= $row->student_name ?></td>
                <td><?= $row->programme ?></td>
                <!-- Add more table cells as needed -->
            </tr>
        <?php endforeach; ?>
    </table>
</body>
</html>


我很感激任何帮助。谢谢

9bfwbjaz

9bfwbjaz1#

如果存在db 1db2database schemas,并且存在db1.attendancedb2.student,则您提供的查询应该可以工作。如果数据库架构位于不同的服务器上,则查询将无法工作。

  • db 1 * 和 db2 是数据库连接,而不是 JoinController.php 控制器中的数据库模式名称**(当然模式名称可以与连接名称相同)!
    确保 * db 1 * 和 db2 连接到同一台服务器,或者您可以使用以下替代解决方案。

一个连接可以连接到多个数据库模式,所以你可以连接表。你不必为此目的有两个不同的连接。下面应该工作。

控制器

<?php

namespace App\Controllers;

use App\Models\JoinModel;
use CodeIgniter\Controller;

class Test extends Controller
{
    public function index()
    {
        // Load the model
        $model = model(JoinModel::class);

        // Get the joined result from the model
        $data['result'] = $model->getJoinedData();

        // Load the view with the data
        return view('join_view', $data);
    }
 }

字符串

型号

<?php

namespace App\Models;

use CodeIgniter\Model;

class JoinModel extends Model
{
    protected $table = 'attendance AS k'; // use table name here

    public function getJoinedData()
    {
        // Perform the join, now you can omit the table name
        $query = $this->select('k.id, k.time_in, k.time_out, s.student_name, s.programme')
            ->join('db2.student as s', 'k.id= s.id')
            ->get();

        // Get the result
        return $query->getResult();
    }
}

  • 注意事项 *:现在,你不需要有一个构造函数。但是如果你真的需要一个 __constructor 在你的模型中,确保你调用了parent的 __constructor,否则你会失去模型的所有功能。或者如果你不需要,干脆不扩展base Model。
  • 注意 *:如果你使用CodeIgniter内置的factory model 方法,这是一个很好的实践。
    如果数据库模式在不同的服务器上,您可以单独查询数据,然后在PHP中连接它们。根据SQL类型,有 * 替代方案 *。例如MySQL,有MySQL联合存储引擎或Oracle数据库链接。或者您可以简单地从一台服务器迁移到另一台服务器。

相关问题