我在使用CakePHP数据库实体的MySQL函数时遇到了麻烦。我在搜索中发现的少数几个提到的只是以前版本的CakePHP,而且不再有效。
此外,使用PHP的函数生成日期不是一种选择。它必须在MySQL服务器上完成。
以下是我的代码示例:
$record = [
$this->_table->primarykey() => $id,
"a" => $a,
"b" => $b,
"c" => $c,
"updated_on" => "NOW()"
];
$result = $this->_table->save(new Entity($record));
这导致数据库中行的0000-00-00 00:00:00
字段中的默认日期时间值为updated_on
,而不是使用当前时间戳填充它。
奖励积分:如果我想添加created_on
字段,我将如何处理实体?如何在首次插入记录时只设置created_on
一次,而不是每次更新?
与往常一样,我非常感谢每一条评论和回答!
答案 0 :(得分:1)
首先,我会不在实体内部执行任何业务逻辑操作。特别是不要将代码放在实体中。如果你真的认为你必须在那里做,那么至少调用一个表方法并在那里封装逻辑。实体被认为是数据对象, nothing 更多。因此,在实体内部执行保存操作会反转架构。这应该在模型的beforeSave()回调中完成。
此外,使用PHP的函数生成日期不是一种选择。它必须在MySQL服务器上完成。
为什么?我没有理由不这样做。不同的时区设置还是什么?性能? NOW() is probably slower if you have lots of writes。那么,只要让你的PHP默认时区匹配,无论数据库使用什么?然后,您可以简单地使用the Timestamp behavior。我很高兴能够学到一些关于不使用NOW()和使用date()的含义的新内容,但到目前为止,我认为绝对不需要使用NOW()。
如果你有read the manual,你可能会看到这个:
CakePHP的ORM为一些常用的SQL函数提供抽象。使用抽象允许ORM选择所需功能的平台特定实现。例如,concat在MySQL,PostgreSQL和SQL Server中的实现方式不同。使用抽象允许您的代码可移植:
该文档还提供了一个示例:
// Results in SELECT COUNT(*) count FROM ...
$query = $articles->find();
$query->select(['count' => $query->func()->count('*')]);
后面是一系列现成支持的功能,包括:
now()将'time'或'date'作为参数,允许您获取当前时间或当前日期。
如果你继续阅读,它会告诉你
除了上述函数之外,func()方法还可用于创建任何通用SQL函数,例如year,date_format,convert等。例如:
我自己还没有必要使用now(),但基于以上信息,我猜它会是:
$date = $query->func()->now();
然后将该值保存到DB。我认为框架的单元测试将显示如何使用它的示例。
奖励积分:如果我想添加created_on字段,我将如何处理实体?如何在首次插入记录时设置created_on一次,而不是每次更新?
$entity->isNew()
将允许您检查实体是否是新的,并采取相应的行动。如果是新的,则设置时间戳。
您在架构错误的地方重新发明了Timestamp行为。这取决于你做对与否。
答案 1 :(得分:0)
这可能不会完全回答你的“我如何使用MySQL函数”的问题,但我可以在general direction中指出你。
然而。要在表格中设置created_on
和updated_on
日期时间字段,我建议使用Cake提供的功能。使用提供的Behaviour:
namespace App\Model\Table;
use Cake\ORM\Table;
class ArticlesTable extends Table
{
public function initialize(array $config)
{
$this->addBehavior('Timestamp', [
'events' => [
'Model.beforeSave' => [
'created_on' => 'new',
'updated_on' => 'always'
]
]
]);
}
}
将Timestamp Behaviour添加到实体表中,您可以让Cake的ORM为您处理字段更新。
答案 2 :(得分:0)
这个合理问题的简单答案是:
now()
这里使用的created
将从PHP服务器而不是数据库中获取时间。但这将与同一桌上的modified
和history=Dataframe()
range= 40
for k in range (range):
epochs=k+1
loss=np.random.rand(k+1,1)
history[k]=loss
字段一致。