CakePHP 3.0 - 在实体中使用MySQL函数

时间:2016-02-29 10:42:49

标签: php mysql cakephp entity cakephp-3.0

我在使用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一次,而不是每次更新?

与往常一样,我非常感谢每一条评论和回答!

3 个答案:

答案 0 :(得分:1)

适当的架构

首先,我会在实体内部执行任何业务逻辑操作。特别是不要将代码放在实体中。如果你真的认为你必须在那里做,那么至少调用一个表方法并在那里封装逻辑。实体被认为是数据对象, nothing 更多。因此,在实体内部执行保存操作会反转架构。这应该在模型的beforeSave()回调中完成。

为什么NOW()vs phps date()需要?

  

此外,使用PHP的函数生成日期不是一种选择。它必须在MySQL服务器上完成。

为什么?我没有理由不这样做。不同的时区设置还是什么?性能? NOW() is probably slower if you have lots of writes。那么,只要让你的PHP默认时区匹配,无论数据库使用什么?然后,您可以简单地使用the Timestamp behavior。我很高兴能够学到一些关于不使用NOW()和使用date()的含义的新内容,但到目前为止,我认为绝对不需要使用NOW()。

将NOW()与CakePHP 3 ORM一起使用

如果你有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_onupdated_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服务器而不是数据库中获取时间。但这将与同一桌上的modifiedhistory=Dataframe() range= 40 for k in range (range): epochs=k+1 loss=np.random.rand(k+1,1) history[k]=loss 字段一致。