【问题标题】:Buggy joins on CodeIgniter ActiveRecordBuggy 加入 CodeIgniter ActiveRecord
【发布时间】:2013-01-19 17:08:23
【问题描述】:

最近,我再次注意到 CodeIgniter 的 ActiveRecord 库中有一个令人难以置信的逻辑错误。

当我尝试在连接中使用“AND”时出现问题。

示例查询:

$this -> db -> join(
    'predict',
    "predict.id_predict = portion.id_predict AND event.id_event = 5",
    'left'
);

结果:

LEFT JOIN `predict` ON
    `predict`.`id_predict` = `portion`.`id_predict`
    AND event.id_event = 5

但应该更有可能:

LEFT JOIN `predict` ON (
     `predict`.`id_predict` = `portion`.`id_predict`
     AND `event`.`id_event` = 5
)

有什么办法可以防止这个错误吗?

【问题讨论】:

  • @RaphaëlAlthaus ellislab.com/forums/viewthread/152221 在检查后仍然视力不佳?
  • 问题是第二个子句中缺少反引号,还是缺少括号?我想知道我的视力是否也在增加,因为我想这两种形式都会返回相同的结果。
  • 实际问题是什么?返回了损坏/错误的数据?一个错误?反引号不应该对查询产生影响,但允许您使用非标准标识符名称。即使event.id_event 没有反引号,它也不应该影响结果。有效的 SQL 语句也不需要额外的括号,尽管它可能有助于将您的意图传达给阅读该语句的其他人。
  • IMO join 应该只包含主要的 join 条件。其余条件可以放在where 子句上。

标签: mysql codeigniter activerecord join left-join


【解决方案1】:
$this->db->join(
    'predict',
    "(predict.id_predict = portion.id_predict AND `event`.`id_event` = 5)",
    'left'
);

你在找这个吗?

编辑

$this->db->join('predict', "predict.id_predict = portion.id_predict", 'left');
$this->db->where('event.id_event = 5');

【讨论】:

    【解决方案2】:

    你也可以使用两次

    $this->db->join(……);
    $this->db->join(……);

    通过活动记录进行多个联接。

    【讨论】:

      猜你喜欢
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      相关资源
      最近更新 更多