MySQL NOW()在Doctrine DBAL插入?

时间:2015-05-07 02:47:13

标签: mysql doctrine-orm

我正盯着http://doctrine-dbal.readthedocs.org/en/latest/reference/data-retrieval-and-manipulation.html#insert

我希望能够做一些像

这样的事情
$db->insert('mytable', [
  'foo' => 'bar',
  'created_on' => new MagicThatMakesNowWork()
]);

这不可能吗?我见过的最好的解决方案是在设置时区时使用PHP获取日期时间,这个时区不太理想。出于某种原因,似乎只有ORM或查询构建器才能处理表达式。我知道在Zend中我可以执行类似new Zend_Db_Expr('NOW()')的操作,它知道对象类型不会在构建的查询中引用NOW()。不需要查询构建器或ORM。

不确定它是否可行或不能很好地记录。 Doctrine DBAL: Updating timestamp field with 'NOW()' value上的第二个答案显示了类型数组中的随机字符串datetime,它看起来很奇怪/坏。

3 个答案:

答案 0 :(得分:1)

您似乎正在尝试自动完成TIMESTAMP列类型的操作。这种情况比2014年更长。使用它,并停止尝试手动管理您的created_onupdated_on字段。 https://dev.mysql.com/doc/refman/5.1/en/datetime.html

答案 1 :(得分:1)

迟到的答案,但我发现这样做最简单的方法是首先运行查询以获取NOW()的值,然后插入该字符串。

一个例子:

$now = $db->fetchColumn("SELECT NOW()");
$db->insert('table', array(
    'field1' => $field1
    ,'created' => $now
));

如果您能确保PHP / MySQL时间同步,那么您可以随时在PHP中创建DateTime对象并将其格式化为为MySQL准备的字符串:

稍微不太理想的替代方案是: / p>

$created = new \Datetime('now', new \DateTimeZone('Europe/Paris'));
$created->format('Y-m-d H:i:s')

答案 2 :(得分:0)

insert不是一个很好的选择。因此,Expression mysql NOW() in Doctrine QueryBuilder的答案显示了手动了解该变量的内容。

这需要最近发布的DBAL> = 2.5。您在2014年运气不佳。请注意,datetime是一个有效的字符串,但似乎没有http://php.net/manual/en/pdo.constants.php

public function insert($params) {

  if (!isset($params[static::CREATED_ON])) {
    $params[] = [static::CREATED_ON, new \Datetime('now'), 'datetime'];
  }

  if (!isset($params[static::MODIFIED_ON])) {
    $params[] = [static::MODIFIED_ON, new \Datetime('now'), 'datetime'];
  }

  $conn = $this->_dbs['write'];
  $query_builder = $conn->createQueryBuilder();

  $query_builder->insert(static::TABLE);

  foreach ( $params as $location => $data ) {

    $field = $data[0];
    $value = $data[1];
    $type = (isset($data[2])) ? $data[2] : \PDO::PARAM_STR;
    $prep = (isset($data[3])) ? $data[3] : '?';

    $query_builder
      ->setValue($field, $prep)
      ->setParameter($location, $value, $type);

  }

  $return = $query_builder->execute();

  if (!$return) {
    throw new \Exception("Failed to execute statement");
  }

  return $conn->lastInsertId();

}
public function update($params, $where) {

  $conn = $this->_dbs['write'];
  $query_builder = $conn->createQueryBuilder();

  $query_builder->update(static::TABLE);

  foreach ( $params as $location => $data ) {
    // can do arbitrary expressions via ['field', null, null, 'ANY EXPRESSION YOU WANT']
    // ie ['votes', null, null,'votes=votes+25']
    // or ['votes', '1', \PDO::PARAM_INT, 'votes + ?']
    $field = $data[0];
    $value = $data[1];
    $type = (isset($data[2])) ? $data[2] : \PDO::PARAM_STR;
    $prep = (isset($data[3])) ? $data[3] : '?';

    $query_builder
      ->set($field, $prep)
      ->setParameter($location, $value, $type);

  }

  $query_builder->where($where);

  return $query_builder->execute();

}