Используйте метку времени Unix в Доктрине Timestampable

Я не думаю, что это возможно. Какой у вас вариант использования? Я считаю, что C # ArrayLists имеет свойство .capacity, но класс Java ArrayList не предоставляет эту информацию.

У вас есть конструктор, который принимает начальный аргумент емкости, и у вас есть метод sureCapacity (), который вы могли бы использовать для уменьшения количества постепенного перераспределения.

У вас также есть метод trimToSize (), который вы можете использовать, если действительно беспокоитесь об использовании памяти.

6
задан 26 July 2009 в 01:38
поделиться

2 ответа

Это вопрос, на который можно получить ответ на самом деле проще, чем я думал вначале ...

Давайте начнем с того, что у вас есть сейчас:

  • модельный класс, который расширяет Doctrine_Record
    • Я назову этот класс Test для моих примеров.
    • В этой модели Test вы хотите использовать поведение Timestampable , но с временными метками UNIX, а не datetime values ​​
    • И вы хотите этого без необходимости писать много конфигурационного материала в ваших моделях.
      (Я это понимаю: меньше риска где-то забыть одну строчку и неправильные данные в БД)
  • Настроенный проект и все
    • , что означает, что вы знаете, что имеете дело с Doctrine
    • , и что я не буду говорить об основах

Решением этой проблемы было бы не использовать поведение по умолчанию Timestampable , которое поставляется с Доктрина, но другая, которую вы определите.
Это означает, что в вашей модели у вас будет что-то вроде этого внизу метода setTableDefinition :

$this->actAs('MyTimestampable');

(я полагаю, это также может быть в методе setUp , кстати - может быть, это было бы реальное место на самом деле)


Теперь нам нужно определить это поведение MyTimestampable , чтобы оно делало то, что мы хотим.
Поскольку Doctrine_Template_Timestampable Doctrine уже достаточно хорошо выполняет свою работу (за исключением формата, конечно) , мы унаследуем его; надеюсь, это будет означать меньшее количество кода для написания ; -)

Итак, мы объявляем наш класс поведения следующим образом:

class MyTimestampable extends Doctrine_Template_Timestampable
{
    // Here it will come ^^
}

Теперь давайте посмотрим, что на самом деле делает Doctrine_Template_Timestampable , в исходном коде Doctrine:

  • немного конфигурации (два поля created_at и updated_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 , ни отметкой времени , теперь мы получаем следующее:

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
  • И только переопределяет его конфигурацию
    • Таким образом, мы можем использовать его по своему усмотрению, используя только одну строку кода в каждой из наших моделей.


Я позволю вам провести более интенсивные тесты, но я надеюсь, что это поможет!
Удачи : -)

33
ответ дан 8 December 2019 в 02:41
поделиться

Одним из методов было бы использование слушателей Doctorine для создания эквивалента временной метки unix при получении записи и перед ее сохранением:

class Base extends Doctrine_Record_Listener
{
    public function preHydrate(Doctrine_Event $event)
    {
        $data = $event->data;

        $data['unix_created_at'] = strtotime($data['created_at']);
        $data['unix_updated_at'] = strtotime($data['updated_at']);

        $event->data = $data;
    }
}

Это может быть ваш базовый класс, который вы расширяете во всем, что нуждается в функциях created_at и updated_at.

Я уверен, что немного повозившись, вы могли бы перебрать $ data и преобразовать все поля datetime 'unix _'. $ field_name.

Удачи

1
ответ дан 8 December 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: