我正盯着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
,它看起来很奇怪/坏。
答案 0 :(得分:1)
您似乎正在尝试自动完成TIMESTAMP
列类型的操作。这种情况比2014年更长。使用它,并停止尝试手动管理您的created_on
和updated_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();
}