【问题标题】:mysql to codeigniter active record helpmysql到codeigniter活动记录帮助
【发布时间】:2011-01-15 10:23:37
【问题描述】:

活动记录是一个新概念,但有时我发现很难让更复杂的查询工作。我发现这至少是 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);

我猜我请求 Null 的方式有问题。为了彻底,我想我会包括所有内容。

【问题讨论】:

  • 有什么问题是什么意思?
  • 查询返回不同的结果。

标签: mysql codeigniter activerecord


【解决方案1】:

我同意有时 CI 活动记录会使事情变得过于复杂。为你的 IS NULL where 子句试试这个:

$this->db->where('members_quests_completed.user_id IS ','NULL',false);

也尝试启用分析器或使用以下命令回显生成的查询:

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

这可能会阐明问题所在。

【讨论】:

  • 因为他明确表示他怀疑问题出在 IS NULL 子句上 - 我使用了上述语法,虽然不是他的,而且一直对我有用。
  • 感谢您的回复,但这似乎也不起作用。我收到一个错误:“on 子句”“10”中的未知列“10”是 $user_id 的值。如果用 sql 编写,此查询可以正常工作。这就是我最终可能会做的事情,这样我可以在 sql 查询中获取用户级别,而不是传递它。
  • 这是您的成员加入行 - CI 正在向表/字段名称添加反引号,并且它不够智能,无法意识到您的 $user_id 值不是表/字段名称。您也许可以重组您的查询以另一种方式获取数据 - 或者,正如您所说,只需调用 $this->db->query() 并完成它可能会更容易!
【解决方案2】:

有时 CI 让它有点复杂......你总是可以使用 $this->db->query("your very long query") 来简化一点(如果我没记错的话,字符串仍然被转义 - 不确定) .这是个人意见。

【讨论】:

    【解决方案3】:
    $this->db->where('column IS NOT NULL')
    

    你的情况

    $this->db->where('members_quests_completed.user_id is not null');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2011-09-26
      相关资源
      最近更新 更多