为什么要“以编程方式像活动记录?”编写MySQL查询?

时间:2011-08-01 07:34:16

标签: php mysql sql frameworks

我正在使用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...

6 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

codeigniter website给出以下原因

  

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

答案 2 :(得分:1)

这是一个意见(我的)...... 你可以使用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);
}

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

答案 3 :(得分:0)

它并没有真正的不同,更重要的是让程序员更容易。因为如果你自己编写查询,你必须自己担心安全性(例如使用mysql注入),他们会为你做这些。您只需要将变量放入并完成。

答案 4 :(得分:0)

在代码中更容易保持一致。在进行插入/更新时,很容易总是逃避字符串等。安全很重要。

答案 5 :(得分:0)

<troll> 因为有些人对SQL过敏,并希望将对象变成关系操作。

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

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