CodeIgniter 4 内部连接在 Codeigniter 中

CodeIgniter 4 Inner Join in Codeigniter

只是想问一下如何在 CodeIgniter 4 上使用 INNER JOIN 功能?我正在尝试将下面的 SQL 语句转换为 CodeIgniter 4,但由于我是这个领域的新手,所以我觉得这很困难。

SELECT l.l_id, u.fname, u.mname, u.lname, u.dept, u.user_type, u.u_grdsec, e.e_name, l.date_added, DATE(l.date_added), date_format(l.date_added, '%H:%i') as 'time'
FROM logs l INNER JOIN users u ON l.u_id = u.u_id
INNER JOIN establishment e ON l.e_id = e.e_id
WHERE DATE(l.date_added) = '$rep_date'
GROUP BY
   date_format(l.date_added, '%H:%i'), l.u_id
ORDER BY l.date_added ASC";

根据我的研究,我发现了这种方式。但是,我不知道如何将 WHERE、GROUP BY 和 ORDER by 子句放在那里。

$builder = $this->db->table("logs as l");
$builder->select('l.l_id, u.fname, u.mname, u.lname, u.dept, u.user_type, u.u_grdsec, e.e_name, l.date_added, DATE(l.date_added), date_format(l.date_added, "%H:%i") as "time"');
$builder->join('users as u', 'l.u_id = u.u_id');
$builder->join('establishment as e', 'l.e_id = e.e_id');
$data = $builder->get()->getResult();

另一件让我困惑的事情是我不知道应该把它放在哪里。我不知道我应该把它放在 Controller 还是放在 Model 文件中。

到目前为止,这是我控制器上的代码。

public function getLogs(){
helper(['form']);
$model = new LogsMod();
$rep_est = $this->request->getPost('rep_est');
$rep_date = $this->request->getPost('rep_date');
$data['logs_data'] = $model->where('DATE(l.date_added)', $rep_date)->groupBy(date_format(l.date_added, '%H:%i'), l.u_id)->orderBy('l.date_added', 'ASC')->findAll();
return view()->to('LogsReport', $data);
}

这是我模型上的代码。

public function getLogs(){

$builder = $this->db->table("logs as l");
$builder->select('l.l_id, u.fname, u.mname, u.lname, u.dept, u.user_type, u.u_grdsec, e.e_name, l.date_added, DATE(l.date_added), date_format(l.date_added, "%H:%i") as "time"');
$builder->join('users as u', 'l.u_id = u.u_id');
$builder->join('establishment as e', 'l.e_id = e.e_id');
$data = $builder->get()->getResult();
}

不过,我不认为两者有联系。

CodeIgniter 4 模型本身就是构建器。您可以使用 class 变量

指定数据库 table
protected $table = '<your table>'; 

在 classes 中扩展 CodeIgniter\Model。 在函数中构建查询时,您可以简单地使用 $this 引用构建器。 所以你的函数看起来像这样:

public function getLogs(){
    $this->select('l.l_id, u.fname, u.mname, u.lname, u.dept, u.user_type, u.u_grdsec, e.e_name, l.date_added, DATE(l.date_added), date_format(l.date_added, "%H:%i") as "time"');
    $this->join('users as u', 'l.u_id = u.u_id');
    $this->join('establishment as e', 'l.e_id = e.e_id');
    $this->where(...);
    $this->orderBy(...);
    return $this->findAll();
}

where() 方法接受 key-value 数组或一对 variables/strings:

$this->where(['key1' => 'value1','key2' => 'value2' ]);
// or
$this->where('key1', 'value1');
$this->where('key2', 'value2');

其中 key1 和 key2 是您的数据库 table 字段。

请注意,在您的控制器中,您应该使用 model() 函数实例化您的模型对象:

$model = model(LogsMod::class);