活动记录是一个很好的概念,但有时我发现很难让更复杂的查询工作。我发现这至少是CI文档缺少的一个地方。
反正 这是我写的sql。它返回用户尚未完成的任务的预期结果,这些任务已解锁并且符合用户级别要求:
SELECT writing_quests . *
FROM `writing_quests`
LEFT OUTER JOIN members_quests_completed ON members_quests_completed.quest_id = writing_quests.id
LEFT OUTER JOIN members ON members.id = $user_id
WHERE writing_quests.unlocked =1
AND writing_quests.level_required <= $userlevel
AND members_quests_completed.user_id IS NULL
这是codeigniter活动记录查询,它返回所有已解锁的任务以及用户级别要求:
$this->db->select('writing_quests.*');
$this->db->from('writing_quests');
$this->db->join('members_quests_completed', 'members_quests_completed.quest_id = writing_quests.id', 'left outer');
$this->db->join('members', "members.id = $user_id", 'left outer');
$this->db->where('writing_quests.unlock', 1);
$this->db->where('writing_quests.level_required <=', $userlevel);
$this->db->where('members_quests_completed.user_id is null', null, true);
我猜我要求Nulls的方式有问题。为了彻底,我想我会包括所有内容。
答案 0 :(得分:0)
我同意CI活动记录有时会使事情过于复杂。试试这个IS NULL where子句:
$this->db->where('members_quests_completed.user_id IS ','NULL',false);
还尝试使用以下命令启用分析器或回显生成的查询:
echo $this->db->last_query();
这可能会解决问题所在。
答案 1 :(得分:0)
有时CI会让它变得有点复杂......你总是可以使用$ this-&gt; db-&gt;查询(“你的超长查询”)来简化一下(如果我没记错,字符串仍然被转义 - 不是当然)。这是个人观点。
答案 2 :(得分:0)
$this->db->where('column IS NOT NULL')
在你的情况下
$this->db->where('members_quests_completed.user_id is not null');