codeigniter:像子句一样的活动记录不起作用

Posted

技术标签:

【中文标题】codeigniter:像子句一样的活动记录不起作用【英文标题】:codeigniter: active record like clause not working 【发布时间】:2016-03-26 18:30:50 【问题描述】:

我正在尝试将此 mysql 查询转换为活动记录,但 like 子句无法正常工作且不返回任何输出。我不明白我实际上错过了什么。

表架构:

tbl_batch:

CREATE TABLE `tbl_batch` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
 `Round` varchar(5) COLLATE utf8_bin NOT NULL,
 `BatchID` varchar(255) COLLATE utf8_bin NOT NULL,
 `TSP` varchar(10) COLLATE utf8_bin NOT NULL,
 `Slot` tinyint(1) NOT NULL,
 `Trade` int(11) NOT NULL,
 `StartDate` date NOT NULL,
 `EndDate` date NOT NULL,
 PRIMARY KEY (`BatchID`),
 UNIQUE KEY `ID` (`ID`),
 UNIQUE KEY `BatchID` (`BatchID`),
 UNIQUE KEY `BatchID_2` (`BatchID`)
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

tbl_tsp_info:

CREATE TABLE `tbl_tsp_info` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
 `TSP` varchar(10) NOT NULL,
 `Name` varchar(50) NOT NULL,
 `Email` varchar(50) NOT NULL,
 `Website` varchar(50) NOT NULL,
 `ContactPerson` varchar(50) NOT NULL,
 `ContactPhone` varchar(11) NOT NULL,
 `Phone` varchar(11) NOT NULL,
 `Fax` varchar(11) NOT NULL,
 `Address` varchar(255) NOT NULL,
 PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4

tbl_instructor_info

CREATE TABLE `tbl_instructor_info` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
 `InstructorID` varchar(7) NOT NULL,
 `Name` varchar(50) NOT NULL,
 `Mobile` varchar(11) NOT NULL,
 `Email` varchar(50) NOT NULL,
 `Trade` int(1) NOT NULL,
 `TSP` int(1) NOT NULL,
 `Slot` tinyint(1) NOT NULL,
 PRIMARY KEY (`ID`),
 UNIQUE KEY `InstructorID` (`InstructorID`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8

MySQL 查询:(完美运行)

SELECT BatchID 
from tbl_batch
WHERE Round='7' 
AND BatchID LIKE concat('%', (SELECT ShortCode FROM tbl_tsp_info WHERE id=
    (SELECT TSP FROM tbl_instructor_info WHERE Email='monir.ssts@gmail.com')),'%')

Codeigniter 模型:

    public function get_batch_byUser($email=string) 
        $this->db->select('TSP');
        $this->db->from('tbl_instructor_info');
        $this->db->where('email',$email);
        $tsp = $this->db->get_compiled_select();

        $this->db->select('ShortCode');
        $this->db->from('tbl_tsp_info');
        $this->db->where("`id`= ($tsp)", null, false);
        $batchCode = $this->db->get_compiled_select();

        $this->db->select('BatchID ');
        $this->db->from('tbl_batch');
        $this->db->where('round',7);
        $this->db->like('BatchID', $batchCode);
        $query = $this->db->get();

        return $query->result();
    

【问题讨论】:

【参考方案1】:

我看到了问题,但解决方案可能有效,也可能无效。

这是查看问题的方法。将您的代码return $query->result(); 的最后一行代码替换为

echo $this->db->get_compiled_select();

你会看到

SELECT `BatchID` 
FROM `tbl_batch` 
WHERE `round` = 7 
AND `BatchID` LIKE '%SELECT `ShortCode`\nFROM `tbl!_tsp!_info`
\nWHERE `id`= (SELECT `TSP`\nFROM `tbl!_instructor!_info`
\nWHERE `email` = \'me@example.com\')%' ESCAPE '!'

查看通配符 (%) 的位置?不会工作。

如果你改变了

$this->db->like('BatchID', $batchCode);

$this->db->like('BatchID', "($batchCode)");

回声是这样的

SELECT `BatchID` FROM `tbl_batch` 
WHERE `round` = 7 
AND `BatchID` 
LIKE '%(SELECT `ShortCode`\nFROM `tbl!_tsp!_info`
\nWHERE `id`= (SELECT `TSP`\nFROM `tbl!_instructor!_info`
\nWHERE `email` = \'me@example.com\'))%' ESCAPE '!'

我不知道这是否会正确执行 - 我没有数据集。但是语法看起来是对的。对吧?

有时“Active Record”(在 Codeigniter > v3.0 “Query Builder”中)并不是获得所需内容的最有效方式。退回到更基本的方法通常会少很多麻烦。

$sql = "SELECT BatchID from tbl_batch WHERE Round='7' AND BatchID 
LIKE concat('%', (SELECT ShortCode FROM tbl_tsp_info 
WHERE id = (SELECT TSP FROM tbl_instructor_info 
    WHERE Email= ?)),'%')";

$query = $this->db->query($sql, [$email]);
return $query->result();

【讨论】:

与你相同但不执行输出。 下划线 (tbl!_tsp!_info) 的转义是问题吗? no no,下划线在表名,我觉得没问题,如果你想看,我可以分享给你。 $batchCode = $this->db->get_compiled_select(); 第二个查询不输出结果,这就是为什么第三个查询没有任何输出显示。

以上是关于codeigniter:像子句一样的活动记录不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Where 子句 CodeIgniter 中的 Active Record 问题

codeigniter 活动记录,生成,但不执行查询

如何在codeigniter活动记录中使用select插入记录

CodeIgniter:应用程序不起作用并且不会记录错误

使用 CodeIgniter Active Record 函数将子句添加到不带引号的 MySQL 语句

如何使用json值在codeigniter where子句中获取记录