Symfony DataFixtures设置默认值

时间:2014-12-26 20:13:23

标签: php symfony datetime sql-update

我想在我的网站中设置初始AdminUser。当我将其加载到数据库时,由于“updateAt”字段,它无法上传。当我将setUpdatedAt留空时,我收到以下错误:

 SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'updatedAt' ca
 nnot be null

我在Fixtures文件中设置的任何值都失败了,我收到以下错误:(我试图在这个例子中输入实际日期)

[Symfony\Component\Debug\Exception\FatalErrorException]
Parse Error: syntax error, unexpected '"2014-12-26 21:01:40"' (T_CONSTANT_E
NCAPSED_STRING), expecting identifier (T_STRING)

这是数据夹具文件:

<?php

namespace Usuarios\AdminBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Usuarios\UsersBundle\Entity\User;

class LoadUserData implements FixtureInterface
{
/**
* {@inheritDoc}
*/
public function load(ObjectManager $manager)
    {
    $userAdmin = new User();
    $userAdmin->setUsername('Admin');
    $userAdmin->setPlainPassword('1234');
    $userAdmin->setEmail('admin@web.com');
    $userAdmin->setRoles(array('ROLE_ADMIN'));
    $userAdmin->setEnabled('1');
    $userAdmin->setUpdatedAt(\"2014-12-26 21:01:40");

    $manager->persist($userAdmin);
    $manager->flush();
    }
}

我试图在updatedAt中以多种不同的类型输入数据,但我无法获得正确的数据类型或获取代码将其留空。

以下是UpdatedAt的实体代码:

<?php

namespace Usuarios\UsersBundle\Entity;

use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;
use Gedmo\Mapping\Annotation as Gedmo;

/**
 * User
 *
 * @ORM\Table(name="0_00_users")
 * @ORM\Entity
 */
class User extends BaseUser

/**
 * @var datetime $updatedAt
 *
 * @Gedmo\Timestampable(on="update")
 * @ORM\Column(name="updatedAt", type="datetime", nullable=true)
 */
protected $updatedAt;

/**
 * Set updatedAt
 *
 * @param \DateTime $updatedAt
 * @return User
 */
public function setUpdatedAt($updatedAt)
{
    $this->updatedAt = $updatedAt;

    return $this;
}

/**
 * Get updatedAt
 *
 * @return \DateTime 
 */
public function getUpdatedAt()
{
    return $this->updatedAt;
}

如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

您错过了$updatedAt值。

这应该是Doctrine的做法。删除你不想要的逻辑。

/**
 * //...
 * @ORM\HasLifecycleCallbacks
 */
class User extends BaseUser

    // ...

    /**
     * Tell doctrine that before we persist or update we call the updatedTimestamps() function.
     *
     * @ORM\PrePersist
     * @ORM\PreUpdate
     */
    public function updatedTimestamps()
    {
        if ($this->getCreatedAt() == null) {
            $this->setCreatedAt(new \DateTime(date('Y-m-d H:i:s')));
        } else {
            $this->setUpdatedAt(new \DateTime(date('Y-m-d H:i:s')));
        }
    }
    // ...
}

答案 1 :(得分:1)

您的日期必须是有效的\ DateTime,而不是字符串。试试这个:

$userAdmin->setUpdatedAt(new \DateTime("2014-12-26 21:01:40"));