【问题标题】:How to set a date in Doctrine 2?如何在教义 2 中设置日期?
【发布时间】:2012-06-05 20:37:15
【问题描述】:

我在学说实体中有一个名为“生日”的字段。

我想创建一个对象以使用教义添加到数据库中。

在控制器内部:

$name = "John Alex";
$birthday = "11-11-90";
$student = new Student();
$student->setName($name);
$student->setBirthday(strtotime($birthday);
...

但是当我尝试坚持时,我得到了这个错误

Fatal error: Call to a member function format() on a non-object in /Library/WebServer/Documents/Symfony/vendor/doctrine-dbal/lib/Doctrine/DBAL/Types/DateType.php on line 44

编辑:

我的实体:

/**
 * @var string $name
 *
 * @ORM\Column(name="name", type="string", length=255)
 */
private $name;

/**
 * @var date $birthday
 *
 * @ORM\Column(name="birthday", type="date", nullable=true)
 */
private $birthday;

/**
 * Set birthday
 *
 * @param date $birthday
 */
public function setBirthday($birthday)
{
    $this->birthday = $birthday;
}

/**
 * Get birthday
 *
 * @return date 
 */
public function getBirthday()
{
    return $this->birthday;
}

【问题讨论】:

标签: symfony doctrine doctrine-orm


【解决方案1】:
$name = "John Alex";
$birthday = "11-11-1990"; // I changed this
$student = new Student();
$student->setName($name);
$student->setBirthday(new \DateTime($birthday)); // setting a new date instance
// ...

【讨论】:

  • 太棒了,这是我尝试在 mysql db 中手动设置一些日期时间类型时遇到的问题。
【解决方案2】:

映射为"datetime""date" 的实体的字段应包含DateTime 的实例。

因此,您的 setter 应进行如下类型提示:

/**
 * Set birthday
 *
 * @param \DateTime|null $birthday
 */
public function setBirthday(\DateTime $birthday = null)
{
    $this->birthday = $birthday ? clone $birthday : null;
}

/**
 * Get birthday
 *
 * @return \DateTime|null 
 */
public function getBirthday()
{
    return $this->birthday ? clone $this->birthday : null;
}

这允许为生日设置nullDateTime 的实例。

如您所见,我还 clone 设置生日日期的值以避免破坏封装(请参阅 Doctrine2 ORM does not save changes to a DateTime field )。

要设置生日,您只需执行以下操作:

$student->setBirthday(new \DateTime('11-11-90'));

【讨论】:

  • php app/console doctrine:generate:entities 仅生成以下方法头 * @param \DateTime $birthdate, * @return Person, public function setBirthdate($birthdate)。当我采用public function setBirthdate(\DateTime $birthdate = NULL) 的方法头时,我得到Argument 1 passed to <...>::setBirthdate() must be an instance of DateTime, string given。但是字符串是空的(因为没有填写表单域)。
  • @rabudde 你不应该生成你的实体。实体是代码库的一部分,是域的核心组件。生成的代码通常不是一个好主意,因为您避免在生成后对其进行测试。此外,您的表单似乎没有将空值转换为 null 值。
猜你喜欢
  • 2011-04-27
  • 1970-01-01
  • 2011-12-22
  • 2012-02-10
  • 2011-10-05
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多