gpt4 book ai didi

php - 在 Doctrine Timestampable 中使用 Unix 时间戳

转载 作者:可可西里 更新时间:2023-11-01 13:02:43 26 4
gpt4 key购买 nike

如何在 Doctrine Timestampable 行为中使用 Unix 时间戳?我发现以下代码片段 here ,但我不想在任何地方手动添加:

$this->actAs('Timestampable', array(
'created' => array('name' => 'created_at',
'type' => 'integer',
'format' => 'U',
'disabled' => false,
'options' => array()),
'updated' => array('name' => 'updated_at',
'type' => 'integer',
'format' => 'U',
'disabled' => false,
'options' => array())));

最佳答案

这是一个可能比我最初想象的更容易得到答案的问题,实际上......

让我们从你现在拥有的开始:

  • 一个模型类,扩展 Doctrine_Record
  • 我会调用这个类Test ,以我的例子为例。
  • 在此 Test模型,您要使用 Timestampable行为,但带有 UNIX 时间戳,而不是 datetime
  • 而且您希望无需在模型中编写大量配置内容。
    (我可以理解:在某处忘记一行以及在 DB 中的错误数据的风险较小)
  • 一个配置好的项目和一切
  • 这意味着您了解 Doctrine
  • 我不会谈论基础知识

  • 此问题的解决方案是不使用默认值 Timestampable Doctrine 附带的行为,但您将定义另一种行为。
    这意味着,在你的模型中,你会在 setTableDefinition 的底部有这样的东西。方法 :
    $this->actAs('MyTimestampable');

    (我想这也可以用在 setUp 方法中,顺便说一句——也许它实际上是真实的地方)

    我们现在要做的是定义 MyTimestampable行为,所以它做我们想要的。
    如 Doctrine Doctrine_Template_Timestampable已经很好地完成了这项工作(当然,格式除外),我们将继承它;希望这意味着编写更少的代码 ;-)

    所以,我们像这样声明我们的行为类:
    class MyTimestampable extends Doctrine_Template_Timestampable
    {
    // Here it will come ^^
    }

    现在,让我们来看看 Doctrine_Template_Timestampable实际上确实如此,在 Doctrine 的代码源中:
  • 一些配置(两个 created_atupdated_at 字段)
  • 下面这行注册了一个监听器:

  • $this->addListener(new Doctrine_Template_Listener_Timestampable($this->_options));

    让我们来看看这个的来源;我们注意到这一部分:
    if ($options['type'] == 'date') {
    return date($options['format'], time());
    } else if ($options['type'] == 'timestamp') {
    return date($options['format'], time());
    } else {
    return time();
    }

    这意味着如果两个 created_at 的类型和 updated_at字段不是 date也不是 timestamp , Doctrine_Template_Listener_Timestampable将自动使用 UNIX 时间戳 - 多么方便!

    因为您不想定义 type要用于您的每个模型中的这些字段,我们将修改我们的 MyTimestampable类(class)。
    请记住,我们说过它正在扩展 Doctrine_Template_Timestampable ,它负责行为的配置......

    因此,我们使用 type 覆盖该配置除了 datetimestamp :
    class MyTimestampable extends Doctrine_Template_Timestampable
    {
    protected $_options = array(
    'created' => array('name' => 'created_at',
    'alias' => null,
    'type' => 'integer',
    'disabled' => false,
    'expression' => false,
    'options' => array('notnull' => true)),
    'updated' => array('name' => 'updated_at',
    'alias' => null,
    'type' => 'integer',
    'disabled' => false,
    'expression' => false,
    'onInsert' => true,
    'options' => array('notnull' => true)));
    }

    我们之前说过我们的模型充当 MyTimestampable ,而不是 Timestampable ... 那么,现在,让我们看看结果 ;-)

    如果我们为 Test 考虑这个模型类:
    class Test extends Doctrine_Record
    {
    public function setTableDefinition()
    {
    $this->setTableName('test');
    $this->hasColumn('id', 'integer', 4, array(
    'type' => 'integer',
    'length' => 4,
    'unsigned' => 0,
    'primary' => true,
    'autoincrement' => true,
    ));
    $this->hasColumn('name', 'string', 32, array(
    'type' => 'string',
    'length' => 32,
    'fixed' => false,
    'primary' => false,
    'notnull' => true,
    'autoincrement' => false,
    ));
    $this->hasColumn('value', 'string', 128, array(
    'type' => 'string',
    'length' => 128,
    'fixed' => false,
    'primary' => false,
    'notnull' => true,
    'autoincrement' => false,
    ));
    $this->hasColumn('created_at', 'integer', 4, array(
    'type' => 'integer',
    'length' => 4,
    'unsigned' => 0,
    'primary' => false,
    'notnull' => true,
    'autoincrement' => false,
    ));
    $this->hasColumn('updated_at', 'integer', 4, array(
    'type' => 'integer',
    'length' => 4,
    'unsigned' => 0,
    'primary' => false,
    'notnull' => false,
    'autoincrement' => false,
    ));
    $this->actAs('MyTimestampable');
    }
    }

    它映射到以下 MySQL 表:
    CREATE TABLE  `test1`.`test` (
    `id` int(11) NOT NULL auto_increment,
    `name` varchar(32) NOT NULL,
    `value` varchar(128) NOT NULL,
    `created_at` int(11) NOT NULL,
    `updated_at` int(11) default NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

    我们可以通过这种方式在表中创建两行:
    $test = new Test();
    $test->name = 'Test 1';
    $test->value = 'My Value 2';
    $test->save();

    $test = new Test();
    $test->name = 'Test 2';
    $test->value = 'My Value 2';
    $test->save();

    如果我们检查数据库中的值,我们将得到如下信息:
    mysql> select * from test;
    +----+--------+----------------+------------+------------+
    | id | name | value | created_at | updated_at |
    +----+--------+----------------+------------+------------+
    | 1 | Test 1 | My Value 1 | 1248805507 | 1248805507 |
    | 2 | Test 2 | My Value 2 | 1248805583 | 1248805583 |
    +----+--------+----------------+------------+------------+
    2 rows in set (0.00 sec)

    所以,我们可以创建行,看起来;-)

    现在,让我们获取并更新第二行:
    $test = Doctrine::getTable('Test')->find(2);
    $test->value = 'My New Value 2';
    $test->save();

    而且,回到数据库,我们现在得到这个:
    mysql> select * from test;
    +----+--------+----------------+------------+------------+
    | id | name | value | created_at | updated_at |
    +----+--------+----------------+------------+------------+
    | 1 | Test 1 | My Value 1 | 1248805507 | 1248805507 |
    | 2 | Test 2 | My New Value 2 | 1248805583 | 1248805821 |
    +----+--------+----------------+------------+------------+
    2 rows in set (0.00 sec)
    updated_at字段已更新, created_at领域没有改变;看起来也不错 ;-)

    因此,为了让事情简短,请放入几个要点,并总结一下:
  • 我们的模型类充当我们自己的 MyTimestampable ,而不是默认 Timestampable
  • 我们的行为延续了 Doctrine 的行为
  • 并且只覆盖它的配置
  • 所以我们可以随心所欲地使用它,每个模型中只有一行代码。

  • 我会让你做一些更密集的测试,但我希望这会有所帮助!
    玩得开心 :-)

    关于php - 在 Doctrine Timestampable 中使用 Unix 时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1183512/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com