【问题标题】:Why would one want to write MySQL queries "programmatically like active record?"为什么要“像活动记录一样以编程方式”编写 MySQL 查询?
【发布时间】:2011-08-01 07:34:16
【问题描述】:

我正在使用 TinyMVC 框架,它允许“以编程方式构建 MySQL 查询,很像活动记录。”示例嵌入此处(relevant TinyMVC documentation):

class Members_Model extends TinyMVC_Model
{
  function get_members()
  {
    $this->db->select('foo,bar,baz'); // set selected columns
    $this->db->from('mytable');  // set from what table(s)
    $this->db->where('foo','test'); // where foo='test'
    $this->db->orwhere('foo=? and bar=?',array('test','test2')) // where foo='test' and bar='test2'
    $this->db->join('jointable','mytable','jointable.foo=mytable.foo'); // join tables on (optional) condition
    $this->db->in('mycolumn',$elements,$islist,$prefix) // IN clause: column, elements (comma-separated or array), $list=boolean is list or array, $prefix: AND|OR
    $this->db->orderby('ordercolumn'); // order by column(s)
    $this->db->groupby('groupbycolumn'); // group by column(s)
    $this->db->limit($limit,$offset); // query limit, optional offset
    $this->db->query();
    while($row = $this->db->next()) {
      $rows[] = $row;
    }
    return $rows;
  }
}

这与直接编写 SQL 查询有何不同或更好:

SELECT foo, bar, baz
FROM mytable
WHERE...

【问题讨论】:

  • 好吧,我来自 .Net 世界,不应该发表评论,但这很奇怪。我必须写很多次$this->db->。应该更流畅。
  • 绝对不是为了可读性。

标签: php mysql sql frameworks


【解决方案1】:

好处是您可以在控制器中拥有相互依赖的函数,这些函数可以构建在您的查询之上,而不必担心 SQL 的顺序。您可以使用条件逻辑对一个查询使用某些活动记录操作,然后在它完全填充后简单地运行它。

CodeIgniter's active record 实现非常有用。我想 TinyMVC 非常相似。

【讨论】:

    【解决方案2】:

    codeigniter website 给出以下原因

    除了简单之外,使用 Active Record 功能的一个主要好处是它允许您创建独立于数据库的应用程序,因为查询语法是由每个数据库适配器生成的。它还允许更安全的查询,因为系统会自动转义值。

    【讨论】:

      【解决方案3】:

      这是一个意见(我的)... 您可以使用部分查询 qithout 处理长字符串。 例如:

      if(){
        $this->db->where($a,$b);
        $this->db->where($c,$d);
        $this->db->where($e,$f);
      }else{
        $this->db->where($g,$h);
        $this->db->where($i,$j);
        $this->db->where($k,$l);
      }
      

      将上面的语句写在一个字符串中不是很好的编码并且难以维护。
      除此之外,您还可以生成跨数据库查询(有助于迁移和货架产品)。 这只是一个很好的理由......

      【讨论】:

        【解决方案4】:

        这并没有什么不同,只是为了让程序员更容易。因为如果您自己编写查询,您必须自己担心使用他们的模型的安全性(例如 mysql 注入),他们会为您做到这一点。您只需将变量放入并完成即可。

        【讨论】:

          【解决方案5】:

          在您的代码中保持一致更容易。并且在进行插入/更新时很容易总是转义字符串等。安全很重要。

          【讨论】:

          • TinyMVC 已经有一个在查询中转义字符串的约定:$this->db->query('select * from table where foo=? and bar=?',array('var1','var2')); - 我是不是在混淆?
          • 有可能。不太了解它,因为我以前没有使用过 TinyMVC。说的是更笼统的说法。如果您使用类来处理数据库查询,则总是会进行转义(如果您已经构建了它)。如果您输入的是原始查询,很容易错过转义部分,然后就会出现安全漏洞。
          【解决方案6】:

          <troll> 因为有些人对 SQL 过敏,想把对象硬塞进关系操作中。

          安全?使用准备好的语句。便携性?每个 DBM 都有一个查询列表。 如果您必须动态生成查询,您可能需要重新考虑如何将数据库层与应用程序层分开。 </troll>

          这些进行数据库查询的方法的优点是所有这些代码都可以使用某些框架快速生成。这使您能够非常快速地制作您经常需要的应用程序原型。 从一个 DBM 到另一个 DBM 时,您不必学习供应商特定的 SQL(谷歌“Oracle 限制”以查看我的意思的示例)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-10-27
            • 1970-01-01
            • 2021-06-22
            • 2021-01-10
            • 2013-11-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多