new
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled

This commit is contained in:
yangsh
2025-12-09 17:28:31 +09:00
parent f5eb8d4788
commit 735120f1cb
378 changed files with 24267 additions and 9248 deletions

View File

@@ -0,0 +1,199 @@
<?php
namespace App\Models\manage;
use CodeIgniter\Model;
class DeptModel extends Model
{
public function getTotalCount($data)
{
$params = [];
$sql = "SELECT
COUNT(*) AS cnt
FROM
departments AS a
WHERE 1=1 ";
if (!empty($data["srchDepth"])) {
$sql .= "AND a.depth = ?";
array_push($params, $data["srchDepth"]);
}
if (!empty($data["srcDeptNm"])) {
$sql .= "AND a.dept_nm LIKE CONCAT('%', ?, '%')";
array_push($params, $data["srcDeptNm"]);
}
if (!empty($data["srcDeptHead"])) {
$sql .= "AND a.dept_head IN (select usr_sq from users where usr_nm LIKE CONCAT('%', ?, '%'))";
array_push($params, $data["srcDeptHead"]);
}
if (!empty($data["useYn"])) {
$sql .= "AND a.use_yn = ?";
array_push($params, $data["useYn"]);
}
$query = $this->db->query($sql, $params ?: []);
return $query->getRow()->cnt;
}
public function getDeptList($start, $end, $data)
{
$params = [];
$sql = "SELECT
dept_sq
, (select dept_nm from departments where dept_sq = a.pdept_sq) as pdept_nm
, pdept_sq
, dept_nm
, dept_desc
, (select usr_nm from users where usr_sq = a.dept_head) as dept_head_nm
, dept_head
, case when a.use_yn = 'Y' then '예' when a.use_yn = 'N' then '아니요' end as use_yn_nm
, use_yn
, case when a.depth = 0 then '컨펌스' when a.depth = 1 then '본부' when a.depth = 2 then '팀' end as depth_nm
, depth
, insert_tm
, (select usr_nm from users where usr_sq = a.insert_usr) insert_usr
, update_tm
, (select usr_nm from users where usr_sq = a.update_usr) update_usr
, lft
, rgt
FROM
departments AS a
WHERE
1=1 ";
if (!empty($data["srchDepth"])) {
$sql .= "AND a.depth = ? ";
array_push($params, $data["srchDepth"]);
}
if (!empty($data["srcDeptNm"])) {
$sql .= "AND a.dept_nm LIKE CONCAT('%', ?, '%') ";
array_push($params, $data["srcDeptNm"]);
}
if (!empty($data["srcDeptHead"])) {
$sql .= "AND a.dept_head IN (select usr_sq from users where usr_nm LIKE CONCAT('%', ?, '%'))";
array_push($params, $data["srcDeptHead"]);
}
if (!empty($data["useYn"])) {
$sql .= "AND a.use_yn = ? ";
array_push($params, $data["useYn"]);
}
$sql .= "ORDER BY a.insert_tm DESC
LIMIT ?, ?
";
$params[] = (int) $start;
$params[] = (int) $end;
$query = $this->db->query($sql, $params);
return $query->getResultArray();
}
public function getUserCount()
{
$sql = "SELECT COUNT(*) AS cnt FROM users WHERE use_yn = 'Y' ";
$query = $this->db->query($sql);
return $query->getRow()->cnt;
}
public function getUserList($start, $end)
{
$sql = "SELECT usr_sq, usr_id, usr_nm FROM users WHERE use_yn = 'Y' ORDER BY usr_sq DESC LIMIT ?, ?";
$params[] = (int) $start;
$params[] = (int) $end;
$query = $this->db->query($sql, $params);
return $query->getResultArray();
}
// 상위조직 조회
public function getPdept()
{
$sql = "SELECT dept_sq, dept_nm FROM departments" .
" WHERE depth = 1" .
" AND use_yn = 'Y'";
$query = $this->db->query($sql);
return $query->getResultArray();
}
// 조직관리 INSERT
public function insertDept($data)
{
$sql = "select ifnull(rgt,1) lft from departments where dept_sq = ?";
$query = $this->db->query($sql, [$data[0]]);
$lft = $query->getRowArray();
$data[] = $lft["lft"];
$data[] = $lft["lft"];
$sql = "INSERT INTO departments
(pdept_sq, dept_nm, dept_desc, dept_head ,use_yn, depth, insert_tm, insert_usr, update_tm, update_usr, lft, rgt)" .
"VALUES (?, ?, ?, ?, ?, ?, now(), ?, now(), ?, ?, ?)";
$this->db->query($sql, $data);
if ($this->db->transStatus() === false) {
return [
'success' => false,
'msg' => '저장실패',
];
}
// 성공
return [
'success' => true,
];
}
// 조직관리 UPDATE
public function updateDept($data)
{
$sql = "UPDATE departments SET" .
" pdept_sq = CASE depth WHEN '0' THEN pdept_sq ELSE ? END," .
" dept_nm = ?," .
" dept_desc = ?," .
" dept_head = ?," .
" use_yn = ?," .
" depth = CASE depth WHEN '0' THEN depth ELSE ? END," .
" update_tm = now()," .
" update_usr = ?" .
" WHERE dept_sq = ?";
$this->db->query($sql, $data);
if ($this->db->transStatus() === false) {
return [
'success' => false,
'msg' => '저장실패',
];
}
// 성공
return [
'success' => true,
];
}
}

View File

@@ -0,0 +1,93 @@
<?php
namespace App\Models\manage;
use CodeIgniter\Model;
class LoginLogModel extends Model
{
public function getTotalCount($data)
{
$params = [];
$sql = "SELECT COUNT(*) AS cnt FROM user_login_log WHERE 1=1 ";
if (!empty($data["srchTxt"])) {
$sql .= "AND (
usr_id_in LIKE CONCAT('%', ?, '%')
OR usr_id_in IN (SELECT usr_id FROM users WHERE usr_nm LIKE CONCAT('%', ?, '%'))
OR ip LIKE CONCAT('%', ?, '%')
OR useragent LIKE CONCAT('%', ?, '%')
) ";
$params[] = $data["srchTxt"];
$params[] = $data["srchTxt"];
$params[] = $data["srchTxt"];
$params[] = $data["srchTxt"];
}
$query = $this->db->query($sql, $params ?: []);
return $query->getRow()->cnt;
}
public function getLoginLogList($start, $end, $data)
{
$sql = "SELECT id, success, usr_sq, usr_id_in, (SELECT usr_nm FROM users WHERE usr_id = usr_id_in) AS usr_nm, ip, useragent, reason, regdate FROM user_login_log ";
$sql .= "WHERE 1=1 ";
if (!empty($data["srchTxt"])) {
$sql .= "AND (
usr_id_in LIKE CONCAT('%', ?, '%')
OR usr_id_in IN (SELECT usr_id FROM users WHERE usr_nm LIKE CONCAT('%', ?, '%'))
OR ip LIKE CONCAT('%', ?, '%')
OR useragent LIKE CONCAT('%', ?, '%')
) ";
$params[] = $data["srchTxt"];
$params[] = $data["srchTxt"];
$params[] = $data["srchTxt"];
$params[] = $data["srchTxt"];
}
$sql .= "ORDER BY id DESC ";
$sql .= "LIMIT ?, ?";
$params[] = (int) $start;
$params[] = (int) $end;
$query = $this->db->query($sql, $params);
return $query->getResultArray();
}
// 엑셀 다운로드 조회
public function getExcelDownList($data)
{
$params = [];
$sql = "SELECT
usr_id_in AS '입력아이디',
(SELECT usr_nm FROM users WHERE usr_id = usr_id_in) AS '사용자명',
ip AS '아이피', useragent AS '사용자 에이전트',
reason AS '사유',
regdate AS '접속일시'
FROM user_login_log ";
$sql .= "WHERE 1=1 ";
if (!empty($data["srchTxt"])) {
$sql .= "AND (
usr_id_in LIKE CONCAT('%', ?, '%')
OR usr_id_in IN (SELECT usr_id FROM users WHERE usr_nm LIKE CONCAT('%', ?, '%'))
OR ip LIKE CONCAT('%', ?, '%')
OR useragent LIKE CONCAT('%', ?, '%')
) ";
$params[] = $data["srchTxt"];
$params[] = $data["srchTxt"];
$params[] = $data["srchTxt"];
$params[] = $data["srchTxt"];
}
$query = $this->db->query($sql, $params ?: []);
return $query->getResultArray();
}
}

View File

@@ -0,0 +1,50 @@
<?php
namespace App\Models\manage;
use CodeIgniter\Model;
class MenuModel extends Model
{
public function getTotalCount()
{
$sql = "SELECT COUNT(*) AS cnt FROM menu WHERE 1=1 ";
$query = $this->db->query($sql);
return $query->getRow()->cnt;
}
public function getMenuList($params)
{
$sql = "SELECT mnu_id, " .
" mnu_pid, " .
" (SELECT mnu_nm FROM menu WHERE mnu_id = a.mnu_pid) mnu_pid_nm, " .
" mnu_nm, " .
" mnu_tp, " .
" mnu_url, " .
" use_yn, " .
" insert_tm, " .
" (select usr_nm from users where usr_sq = a.insert_usr) insert_usr, " .
" (select usr_nm from users where usr_sq = a.update_usr) update_usr, " .
" update_tm " .
" FROM menu a ";
$sql .= "WHERE 1=1 ";
// if (!empty($params['pid'])) {
// $sql .= " AND mnu_pid = {$params['pid']} ";
// }
$sql .= " ORDER BY CASE WHEN mnu_pid = 'ROOT' THEN 0 ELSE 1 END, mnu_id";
$query = $this->db->query($sql);
return $query->getResultArray();
}
}

View File

@@ -0,0 +1,79 @@
<?php
namespace App\Models\manage;
use CodeIgniter\Model;
class PhoneModel extends Model
{
public function getCodes()
{
$sql = "SELECT category, cd, cd_nm, use_yn FROM codes WHERE category = 'CP_ID' AND use_yn = 'Y' ORDER BY view_odr ASC";
$query = $this->db->query($sql);
return $query->getResultArray();
}
public function getTotalCount($data)
{
$sql = "SELECT
COUNT(*) AS cnt
FROM
dupl_phone_list AS a
LEFT JOIN codes AS b ON a.cpid = b.cd AND b.category = 'CP_ID' ";
$query = $this->db->query($sql);
return $query->getRow()->cnt;
}
public function getDuplPhoneList($start, $end, $data)
{
$params = [];
$sql = "SELECT
a.*
, (CASE a.use_yn WHEN 'Y' THEN '사용' WHEN 'N' THEN '미사용' END) use_yn_nm
, b.cd_nm as cpid_nm
FROM
dupl_phone_list AS a
LEFT JOIN codes AS b ON a.cpid = b.cd AND b.category = 'CP_ID' ";
$sql .= "ORDER BY a.use_yn ASC, a.s_date DESC ";
$sql .= " LIMIT ?, ?";
$params[] = (int) $start;
$params[] = (int) $end;
$query = $this->db->query($sql, $params);
return $query->getResultArray();
}
public function insertDuplPhone($data)
{
$sql = "INSERT INTO dupl_phone_list " .
" ( phone_number, use_yn, s_date, e_date, address" .
" , owner, applicant, relation" .
" , cpid, memo, insert_tm, insert_user_id)" .
" VALUES ( ?, ?, ?, ?, ? " .
" , ?, ?, ?" .
" , ?, ?, SYSDATE(), ?)";
$this->db->query($sql, $data);
if ($this->db->transStatus() === false) {
return [
'success' => false,
'msg' => '저장실패',
];
}
// 성공
return [
'success' => true,
];
}
}

View File

@@ -0,0 +1,443 @@
<?php
namespace App\Models\manage;
use CodeIgniter\Model;
class UserModel extends Model
{
// 유저레벨
public function getUserLevel()
{
$sql = "SELECT cd, cd_nm" .
" FROM codes" .
" WHERE category = 'USER_LEVEL'" .
" AND use_yn = 'Y'" .
" ORDER BY view_odr asc";
$query = $this->db->query($sql);
return $query->getResultArray();
}
// 본부리스트
public function getBonbuList()
{
$sql = "SELECT dept_sq, pdept_sq, dept_nm, dept_desc, dept_head, use_yn, depth, insert_tm, insert_usr, update_tm, update_usr, lft, rgt" .
" FROM departments" .
" WHERE depth = 1" .
" AND use_yn = 'Y'" .
" ORDER BY lft";
$query = $this->db->query($sql);
return $query->getResultArray();
}
// 팀리스트
public function getTeamList()
{
$sql = "SELECT dept_sq, pdept_sq, dept_nm" .
" FROM departments" .
" WHERE depth = 2" .
" AND use_yn = 'Y'" .
" ORDER BY dept_nm";
$query = $this->db->query($sql);
return $query->getResultArray();
}
// 조직리스트
public function getDeptCode()
{
$sql = "SELECT dept_sq, pdept_sq, dept_nm, dept_desc, dept_head, use_yn, depth, insert_tm, insert_usr, update_tm, update_usr, lft, rgt" .
" FROM departments" .
" WHERE use_yn = 'Y' " .
" ORDER BY lft";
$query = $this->db->query($sql);
return $query->getResultArray();
}
public function getTotalCount($data)
{
$params = [];
$sql = "SELECT COUNT(*) AS cnt FROM users AS a WHERE 1=1 ";
if (!empty($data['srchLevel'])) {
$sql .= " AND a.usr_level = ?";
array_push($params, $data['srchLevel']);
}
if (!empty($data['srchTeam'])) {
$sql .= " AND a.dept_sq = ? ";
array_push($params, $data['srchTeam']);
}
if (!empty($data['useYn'])) {
$sql .= " AND a.use_yn = ? ";
array_push($params, $data['useYn']);
}
if (!empty($data['srchTxt'])) {
switch ($data['srchType']):
case "1":
$sql .= " AND a.usr_nm LIKE CONCAT('%', ?, '%') ";
array_push($params, $data['srchTxt']);
break;
case "2":
$sql .= " AND a.usr_id LIKE CONCAT('%', ?, '%') ";
array_push($params, $data['srchTxt']);
break;
case "3":
$sql .= " AND a.usr_position LIKE CONCAT('%', ?, '%') ";
array_push($params, $data['srchTxt']);
break;
case "4":
$sql .= " AND REPLACE(a.usr_tel1, '-', '') LIKE CONCAT('%', REPLACE(?, '-', ''), '%') ";
array_push($params, $data['srchTxt']);
break;
case "5":
$sql .= " AND CONCAT(a.usr_addr1, ' ', a.usr_addr2) LIKE CONCAT('%', ?, '%') ";
array_push($params, $data['srchTxt']);
break;
default:
$sql .= "
AND (
a.usr_nm LIKE CONCAT('%', ?, '%')
OR a.usr_id LIKE CONCAT('%', ?, '%')
OR a.usr_position LIKE CONCAT('%', ?, '%')
OR REPLACE(a.usr_tel1, '-', '') LIKE CONCAT('%', REPLACE(?, '-', ''), '%')
OR CONCAT(a.usr_addr1, ' ', a.usr_addr2) LIKE CONCAT('%', ?, '%')
)
";
array_push($params, $data['srchTxt']);
array_push($params, $data['srchTxt']);
array_push($params, $data['srchTxt']);
array_push($params, $data['srchTxt']);
array_push($params, $data['srchTxt']);
break;
endswitch;
}
$query = $this->db->query($sql, $params ?: []);
return $query->getRow()->cnt;
}
public function getUserList($start, $end, $data)
{
$params = [];
$sql = "SELECT
usr_sq
, (select dept_sq from departments where dept_sq = (select pdept_sq from departments where a.dept_sq = dept_sq)) pdept_sq
, (select dept_nm from departments where dept_sq = (select pdept_sq from departments where a.dept_sq = dept_sq)) pdept_nm
, (select dept_nm from departments where a.dept_sq = dept_sq) as dept_nm
, dept_sq
, usr_id
, usr_nm
, (select cd_nm from codes where a.usr_level = cd and category = 'USER_LEVEL') level_nm
, usr_level
, usr_position
, usr_tel1
, usr_tel2
, usr_addr1
, usr_addr2
, insert_tm
, (select usr_nm from users where usr_sq = a.insert_usr) insert_usr
, update_tm
, (select usr_nm from users where usr_sq = a.update_usr) update_usr
, use_yn
, case when a.use_yn = 'Y' then '예' when a.use_yn = 'N' then '아니요' end as use_yn_nm
, sms_auth_yn
, case when a.sms_auth_yn = 'Y' then '예' when a.sms_auth_yn = 'N' then '아니요' end as sms_auth_yn_nm
, last_usr_pw_tm
FROM
users AS a
WHERE
1=1 ";
if (!empty($data['srchLevel'])) {
$sql .= " AND a.usr_level = ?";
array_push($params, $data['srchLevel']);
}
if (!empty($data['srchTeam'])) {
$sql .= " AND a.dept_sq = ?";
array_push($params, $data['srchTeam']);
}
if (!empty($data['useYn'])) {
$sql .= " AND a.use_yn = ?";
array_push($params, $data['useYn']);
}
if (!empty($data['srchTxt'])) {
switch ($data['srchType']):
case "1":
$sql .= " AND a.usr_nm LIKE CONCAT('%', ?, '%') ";
array_push($params, $data['srchTxt']);
break;
case "2":
$sql .= " AND a.usr_id LIKE CONCAT('%', ?, '%') ";
array_push($params, $data['srchTxt']);
break;
case "3":
$sql .= " AND a.usr_position LIKE CONCAT('%', ?, '%') ";
array_push($params, $data['srchTxt']);
break;
case "4":
$sql .= " AND REPLACE(a.usr_tel1, '-', '') LIKE CONCAT('%', REPLACE(?, '-', ''), '%') ";
array_push($params, $data['srchTxt']);
break;
case "5":
$sql .= " AND CONCAT(a.usr_addr1, ' ', a.usr_addr2) LIKE CONCAT('%', ?, '%') ";
array_push($params, $data['srchTxt']);
break;
default:
$sql .= "
AND (
a.usr_nm LIKE CONCAT('%', ?, '%')
OR a.usr_id LIKE CONCAT('%', ?, '%')
OR a.usr_position LIKE CONCAT('%', ?, '%')
OR REPLACE(a.usr_tel1, '-', '') LIKE CONCAT('%', REPLACE(?, '-', ''), '%')
OR CONCAT(a.usr_addr1, ' ', a.usr_addr2) LIKE CONCAT('%', ?, '%')
)
";
array_push($params, $data['srchTxt']);
array_push($params, $data['srchTxt']);
array_push($params, $data['srchTxt']);
array_push($params, $data['srchTxt']);
array_push($params, $data['srchTxt']);
break;
endswitch;
}
$sql .= "ORDER BY a.insert_tm DESC ";
$sql .= "LIMIT ?, ?";
$params[] = (int) $start; // offset
$params[] = (int) $end; // limit
$query = $this->db->query($sql, $params);
return $query->getResultArray();
}
// 유저등록
public function insertUser($data)
{
$sql = "INSERT INTO users
(usr_id, usr_pw, dept_sq, usr_nm, usr_level, usr_position, usr_tel1, usr_tel2, usr_addr1, usr_addr2, insert_tm, insert_usr, use_yn, sms_auth_yn, last_usr_pw_tm)" .
" VALUES (?, SHA2(?,256), ?, ?, ?, ?, ?, ?, ?, ?, now(), ?, ?, ?, now())";
$this->db->query($sql, $data);
if ($this->db->transStatus() === false) {
return [
'success' => false,
'msg' => '저장실패',
];
}
// 성공
return [
'success' => true,
];
}
// 유저수정
public function updateUser($data, $addUserPswd, $usrSq)
{
$sql = "UPDATE users SET
usr_nm = ?,
dept_sq = ?,
usr_level = ?,
usr_position = ?,
usr_tel1 = ?,
usr_tel2 = ?,
usr_addr1 = ?,
usr_addr2 = ?,
update_tm = NOW(),
update_usr = ?,
use_yn = ?,
sms_auth_yn = ?";
$params = [
$data[0], // usr_nm
$data[1], // dept_sq
$data[2], // usr_level
$data[3], // usr_position
$data[4], // usr_tel1
$data[5], // usr_tel2
$data[6], // usr_addr1
$data[7], // usr_addr2
$data[8], // update_usr
$data[9], // use_yn
$data[10], // sms_auth_yn
];
if (!empty($addUserPswd)) {
$sql .= ", usr_pw = SHA2(?, 256),
last_usr_pw_tm = NOW()";
$params[] = $addUserPswd;
}
$sql .= " WHERE usr_sq = ?";
$params[] = $usrSq;
$this->db->query($sql, $params);
if ($this->db->transStatus() === false) {
return [
'success' => false,
'msg' => '저장실패',
];
}
// 성공
return [
'success' => true,
];
}
public function removeUser($data)
{
$sql = " UPDATE users " .
" SET usr_nm = '***' " .
" ,usr_pw = '1234' " .
" ,usr_tel1 = '***' " .
" ,usr_tel2 = '' " .
" ,usr_addr1 = '' " .
" ,usr_position = '' " .
" ,dept_sq = '14' " . //소속조직 : 퇴사자 관리
" ,sms_auth_yn = 'N' " .
" ,use_yn = 'N' " .
" ,usr_addr2 = '삭제' " .
" ,update_tm = NOW() " .
" ,update_usr = ? " .
" WHERE usr_sq = ? ";
$this->db->query($sql, $data);
if ($this->db->transStatus() === false) {
return [
'success' => false,
'msg' => '저장실패',
];
}
// 성공
return [
'success' => true,
];
}
// 엑셀 다운로드 조회
public function getExcelUserList($data)
{
$params = [];
$sql = "SELECT
(select dept_nm from departments where dept_sq = (select pdept_sq from departments where a.dept_sq = dept_sq)) AS '소속본부'
, (select dept_nm from departments where a.dept_sq = dept_sq) AS '소속팀'
, usr_id AS '사원번호'
, usr_nm AS '사용자명'
, (SELECT cd_nm FROM codes where a.usr_level = cd and category = 'USER_LEVEL') AS '등급'
, usr_position AS '직급'
, usr_tel1 AS '연락처'
, CONCAT(usr_addr1, usr_addr2) AS '주소'
, case when a.sms_auth_yn = 'Y' then '예' when a.sms_auth_yn = 'N' then '아니요' end AS 'SMS인증여부'
, insert_tm AS '등록자'
, (select usr_nm from users where usr_sq = a.insert_usr) AS '등록일시'
, update_tm AS '수정자'
, (select usr_nm from users where usr_sq = a.update_usr) AS '수정일시'
, last_usr_pw_tm AS '비빌번호변경일시'
FROM
users AS a
WHERE
1=1 ";
if (!empty($data['srchLevel'])) {
$sql .= " AND a.usr_level = ? ";
array_push($params, $data['srchLevel']);
}
if (!empty($data['srchTeam'])) {
$sql .= " AND a.dept_sq = ? ";
array_push($params, $data['srchTeam']);
}
if (!empty($data['useYn'])) {
$sql .= " AND a.use_yn = ? ";
array_push($params, $data['useYn']);
}
if (!empty($data['srchTxt'])) {
switch ($data['srchType']):
case "1":
$sql .= " AND a.usr_nm LIKE CONCAT('%', ?, '%') ";
array_push($params, $data['srchTxt']);
break;
case "2":
$sql .= " AND a.usr_id LIKE CONCAT('%', ?, '%') ";
array_push($params, $data['srchTxt']);
break;
case "3":
$sql .= " AND a.usr_position LIKE CONCAT('%', ?, '%') ";
array_push($params, $data['srchTxt']);
break;
case "4":
$sql .= " AND REPLACE(a.usr_tel1, '-', '') LIKE CONCAT('%', REPLACE(?, '-', ''), '%') ";
array_push($params, $data['srchTxt']);
break;
case "5":
$sql .= " AND CONCAT(a.usr_addr1, ' ', a.usr_addr2) LIKE CONCAT('%', ?, '%') ";
array_push($params, $data['srchTxt']);
break;
default:
$sql .= "
AND (
a.usr_nm LIKE CONCAT('%', ?, '%')
OR a.usr_id LIKE CONCAT('%', ?, '%')
OR a.usr_position LIKE CONCAT('%', ?, '%')
OR REPLACE(a.usr_tel1, '-', '') LIKE CONCAT('%', REPLACE(?, '-', ''), '%')
OR CONCAT(a.usr_addr1, ' ', a.usr_addr2) LIKE CONCAT('%', ?, '%')
)
";
array_push($params, $data['srchTxt']);
array_push($params, $data['srchTxt']);
array_push($params, $data['srchTxt']);
array_push($params, $data['srchTxt']);
array_push($params, $data['srchTxt']);
break;
endswitch;
}
$sql .= "ORDER BY a.insert_tm DESC ";
$query = $this->db->query($sql, $params ?: []);
return $query->getResultArray();
}
}