Какая команда на выполнение, чтобы создалась таблица в базе?
И как описать поле datetime чтобы добавлялась функция NOW()
Answer 1
Если вы описываете сущность в .yml файлах, то вот несколько bash комманд:
Генерация сущностей (Entity.php)
$ ./app/console doctrine:generate:entities NameAppBundle
Генерация миграции
$ ./app/console doctrine:migrations:diff
Применение миграций
$ ./app/console doctrine:migrations:migrate
Для просмотра всех доступных команд с описанием
$ ./app/console
А для типа поля datetime я использую prePersist и/или preUpdate
Answer 2
Хочу обратить внимание при использования NOW() на следующие моменты:
- При использовании NOW() - приложение зависит от настроек
даты/времени (а они могут запросто отличаться от настроек
веб-сервера) сервера СУБД, про это можно легко забыть, ладно если
это поле используется исключительно для внутренних целей приложения,
а если это дата, например, бронирования и можно случайно забыть
преобразовать дату к нужной временной зоне
- Когда значение по-умолчанию задается в конфиге для сущности, а не в конструкторе, то может случиться такая коллизия, что создан новый экземпляр
сущности, который еще не сохранен в СУБД, а вы попытаетесь
обратиться к такому полю, и сделать с ним что-то, и если не
проверять значение на null (в случае даты), то можно получить
ошибку, ведь поле еще не проинициализировано. Зачем в голове держать ту информацию?
- К чему я подвожу, на
мой взгляд удобное место для задания значения по-умолчанию - это
конструктор сущности, во-первых, легче понять и помнить какие
значения по-умолчанию присваиваются полям, во-вторых такие поля уже
будут проинициализированы при создании экземпляра класса, в третьих
приложение зависит только от настроек веб-сервера (в части временной
зоны)
- А если в приложении требуется особая логика, то как было отмечено выше, все значения можно инициализировать с помощью событий доктрины.
Answer 3
Вот Вам небольшой пример с оф.документации
use AppBundle\Entity\Product;
use Symfony\Component\HttpFoundation\Response;
// ...
public function createAction()
{
$product = new Product();
$product->setName('A Foo Bar');
$product->setPrice('19.99');
$product->setDescription('Lorem ipsum dolor');
$em = $this->getDoctrine()->getManager();
$em->persist($product);
$em->flush();
return new Response('Created product id '.$product->getId());
}