Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 19 мар 2024, 10:35

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу Пред.  1, 2
Автор Сообщение
СообщениеДобавлено: 09 окт 2012, 08:52 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Теперь как памятку для себя и других напишу :)

TIMESTAMP удобен тем, что при операциях INSERT или UPDATE первое поле этого типа может автоматически обновляется до текущего значения.

Т.е. если в структуре таблицы:
Код:
`created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
`updated` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00',
- поле `created` при создании записи в таблице автоматически вставит текущую дату
- поле `updated` нужно будет обновлять самому

Такое не прокатит:
Код:
`created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,
т.к. автоматом обновляется только первое поле

Если в структуре таблицы:
Код:
`date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
- в поле `date` при создании записи в таблице автоматически подставится текущая дата, и автоматически будет обновляться при изменениях записи (дату создания затрет)

Если мы будем извлекать дату из бд:
Код:
SELECT `date` FROM `table_name`;
то получим ее в формате: 'YYYY-MM-DD HH:MM:SS'

Чтобы ее вывести в формате нужнном нам, делаем например так:
Код:
$date = new DateTime($date_string);
echo $date->format('d m Y');   
где $date_string - строка вида 'YYYY-MM-DD HH:MM:SS'. Выведет вроде этого:
> 09 10 2012

В PHP также удобно работать с UNIX_TIMESTAMP и чтобы извлечь дату в виде секунд нужно сделать так:
Код:
SELECT UNIX_TIMESTAMP(`date`) AS `date` FROM `table_name`;
Код:
echo date('d m Y', $date);   
где $date - метка времени (секунды тпа 20121349725879 или time() - текущее время в секундах) Выведет вроде этого:
> 09 10 2012

Теперь, что касается Kohana

Т.е. если в структуре таблицы:
Код:
`created` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00',
`updated` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00',
то написав в модели ORM так:
Код:
// Автоматическое сохранение даты создания записи
protected $_created_column = array(
    'column' => 'created',
    'format' => 'Y-m-d H:i:s',
);

// Автоматическое сохранение даты обновления записи
protected $_updated_column = array(
    'column' => 'updated',
    'format' => 'Y-m-d H:i:s'
);  
мы обеспечим автоматическое сохранение времени создания и обновления записи средствами Kohana

Если в структуре таблицы:
Код:
`created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
`updated` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00',
достаточно будет
Код:
// Автоматическое сохранение даты обновления записи
protected $_updated_column = array(
    'column' => 'updated',
    'format' => 'Y-m-d H:i:s'
);  
Автоматическое сохранение даты создания записи обеспечит mysql

Получим из БД мы тоже их в формате 'YYYY-MM-DD HH:MM:SS' и приведем их к нужному виду с помощью класса DateTime(), например так:
Код:
$obj = ORM::factory('model', $id);
$date = new DateTime($obj->created);
echo $date->format('d m Y'); 

$obj 
= ORM::factory('model', $id);
$date = new DateTime($obj->updated);
echo $date->format('d m Y'); 
 

Еще мы можем хранить дату в секундах в поле типа int
Код:
`created` INT(11) UNSIGNED DEFAULT NULL,
`
updated` INT(11) UNSIGNED DEFAULT NULL,  
Код:
// Автоматическое сохранение даты создания записи
protected $_created_column = array(
    'column' => 'created',
    'format' => true,
);

// Автоматическое сохранение даты обновления записи
protected $_updated_column = array(
    'column' => 'updated',
    'format' => true,
);
  
Тогда дата будет сохранятся в виде целого числа в секундах.
Получим из БД мы тоже их в виде секунд и приведем их к нужному виду с помощбю функции PHP date(), например так:
Код:
$obj = ORM::factory('model', $id);
echo date('d m Y', $obj->created);
echo date('d m Y', $obj->updated);  

Блин, тут целая статья получается, ну его нафиг все...))

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 окт 2012, 17:29 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
Цитата:
Я говорю про mysql, а не php
Что делает date я прекрасно знаю


Мы говорим на разных языках? :)

Я говорю, что зачем всё это, когда можно сделать в БД это поле типом int. И хранить там значения типа 1305488194 (например).
Это же просто. И читать такой формат, и показывать на странице через функцию date(), и записывать в БД. Всё, больше я ничего не имел ввиду ))


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 окт 2012, 19:27 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Поэтому я и написал развернутый ответ)

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 окт 2012, 23:12 
Не в сети
Бывалый

Зарегистрирован: 16 апр 2012, 19:44
Сообщения: 113
AmberLEX писал(а):
Теперь как памятку для себя и других напишу :)
.......
Блин, тут целая статья получается, ну его нафиг все...))


отлично получилось!!! Спасибо!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 10 окт 2012, 12:00 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Цитата:
отлично получилось!!! Спасибо!
Всегда пожалуйста.
Сам не ожидал, что такой объем выйдет. Можно и подробнее было написать, но тогда это на статью для блога больше потянет, а не для форума)

Цитата:
Я говорю, что зачем всё это, когда можно сделать в БД это поле типом int.
Даже не знаю, что удобнее. Так в БД смотришь - видно дату сразу, а не секунды и понятно. А если использовать какой-то продвинутый MySQL менеджер, там вообще календарик вываливается и можно выставить дату.
Т.к. на странице максимум 100 записей отображается, а обычно 10-25 с датой, не думаю, что использование
Код:
$date = new DateTime($obj->created);
echo $date->format('d m Y');  
критично по скорости. Тем более можно это оформить в статический метод для удобства.

Нужно как-то преимущества и недостатки каждого из способов хранения описать.

Например, если месяц не нужно отображать на русском, то можно вообще использовать DATE_FORMAT MySQL и сделать так (с int так не сделаешь)
Код:
$sql = "
    SELECT
        `title`,
        DATE_FORMAT(`created`,'%d.%m.%Y') AS `created`
    FROM
        `table_name`
"
;

$obj = DB::query(Database::SELECT, $sql)->as_object()->execute();
 

В шаблоне написать так
Код:
<?php foreach ($obj as $o): ?>
   <?php echo $o->title . ' | ' . $o->created . '<br />' ?>
<?php endforeach ?>
Выведет типа такого
Код:
Почему мал pадиотелескоп Максвелла | 09.10.2012
Параметр Родинга-Гамильтона | 09.10.2012
Изоморфный ньютонометр глазами современников | 05.10.2012
Хроматический форшлаг: предпосылки и развитие | 10.10.2012
Или немного извратиться и вообще сделать как здесь - месяц на русском языке)

ORM вариант:
Код:
$obj = ORM::factory('model')
    ->select(array(DB::expr("DATE_FORMAT(`created`, '%d.%m.%Y')"), 'date_post'))
    ->find_all();
 
Код:
<?php foreach ($obj as $o): ?>
    <?php echo $o->title . ' | ' . $o->date_post . '<br />' ?>
<?php endforeach ?>

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 10 окт 2012, 13:47 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
> Например, если месяц не нужно отображать на русском, то можно вообще использовать DATE_FORMAT MySQL и сделать так (с int так не сделаешь)

А зачем?
SELECT date FROM и всё )
Ладно, у каждого свои методы


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 10 окт 2012, 15:53 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
> А зачем?

Тогда он получит дату в полном формате YYYY-MM-DD HH:MM:SS и нужно будет еще в php при выводе писать date('d m Y', $obj->date), а так он сразу выберет нужный формат.

Ну это я для информации написал про DATE_FORMAT. Хотя так делать в ORM - помойму извращение)

Если строить запросы не через ORM, а так: DB::query(Database::SELECT, $sql)->as_object()->execute(); почему бы тогда не форматировать дату при выборке, если нужно?
Ну в общем есть такая возможность)

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 10 окт 2012, 16:05 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
Есть у меня такой хелпер...
Код:
<?php defined('SYSPATH') or die('No direct script access.');

/**
 * Misc Kohana helper
 *
 * @package    Sskin
 * @category   Helpers
 * @author     Sergey Yakovlev
 * @copyright  (c) 2012 Anterra Group
 */
class Etc {

  /**
   * @var string|null Datetime format, eg: 'D, d M Y H:i:s'
   */
  public static $format = NULL;

  /**
   * @var string Dafault datetime format
   */
  protected static $_default_format = 'd.m.Y';

  /**
   * Gets the format specified in file
   *
   * @return string
   */
  public static function get_format(){
    if (is_null(self::$format))
    {
      $app_config = Kohana::$config->load('site');
      self::$format = ($app_config['application']['date_format']) ? $app_config['application']['date_format'] : self::$_default_format;
    }
    return self::$format;
  }

  /**
   * Gets the formated date string
   *
   * @param int|null $timestamp timestamp
   * @return string Formated date string, eg: '24.09.2011'
   */
  public static function get_date($timestamp = NULL)
  {
    if(is_null($timestamp))
    {
      $timestamp = time();
    }
    return date(self::get_format(), (int)$timestamp);
  }
}


Так вот, например в админке, когда нужно показать дату создания или изменения страницы, просто пишу:
Код:
<?php echo Etc::get_date($page->created) ?>
<?php echo Etc::get_date($page->modified) ?>


Естественно в $page->created и $page->modified хранятся даты типа 1304978011


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 окт 2012, 07:59 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
Sergey писал(а):
Есть у меня такой хелпер...


Теперь у меня есть вот такой хелпер: viewtopic.php?f=38&t=409 ;)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group