Doctrine2不会持久存在某些领域

时间:2012-12-12 16:20:36

标签: php symfony doctrine-orm persist

几分钟前,我在Doctrine2中发现了一个错误。

我在我的实体中添加了一些字段,然后刷新mysql表并继续保持之前我注意到新数据没有存储在表中。

尝试了var_dump" - > getXXX()"的值。结果是对的。

以下是使用的代码:

$user->setName($name);
$user->setSurname($surname);

if($country)
   $user->setCountry($country->getId());

//New code 

if($province > 0)
    $user->setProvince($province);

if($town > 0)
    $user->setTown($town);

var_dump($user->getProvince(), $user->getTown()); //Works OK

$em->persist($user); // Only persists values before Province.
$em->flush();

感谢&并且问候!


被修改

有关我的实体的信息:

class Users
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="bigint")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

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

    /**
     * @var string $mail
     *
     * @ORM\Column(name="mail", type="string", length=80, unique=true)
     */
    private $mail;

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

    /**
     * @var $country
     *
     * @ORM\Column(name="country", type="integer")
     */
    private $country;

    /**
     * @var $province
     *
     * @ORM\Column(name="province", type="integer")
     */
    private $province;

    /**
     * @var $town
     *
     * @ORM\Column(name="town", type="integer")
     */
    private $town;
}

国家,省和城镇是来自同名姓名表的id。我尝试使用ManytoOne协议更改字段的类型,但它在Doctrine2生成的SQL上出现错误。它似乎是一个缓存错误,但我无法解决它。

2 个答案:

答案 0 :(得分:2)

使用doctrine:schema:update时,我与Doctrine有同样的问题。和@lifo一样,我不得不重启apache。不同之处在于我没有运行apc,所以我认为Doctrine为模型做了一些内部缓存。

$ apachectl -M | grep apc
Syntax OK

答案 1 :(得分:0)

您需要了解有关Doctrine协会如何运作的知识。我建议花一些时间,真正阅读Doctrine mapping documentation

您的用户实体不应该使用这样的整数。你可能想要一个ManyToOne关系(意思是:每个用户可以只有一个国家和一个省)。您应该开始将事物视为对象并尽量不要传递 ID

例如:

/**
 * @ORM\ManyToOne(targetEntity="Country")
 * @ORM\JoinColumn(name="countryId", referencedColumnName="id")
 */
private $country;

/**
 * @ORM\ManyToOne(targetEntity="Province")
 * @ORM\JoinColumn(name="provinceId", referencedColumnName="id")
 */
private $province;

每个中的targetEntity都应该更改为您调用的实体。

如果您尝试进行这些更改,请确保运行app/console doctrine:schema:update命令以自动更新架构。

然后你可以在控制器中执行此操作:

$country = new Country('US');
$entityManager->persist($country);
$user->setCountry($country);

注意:我没有将国家/地区ID分配给setCountry()方法。我传入了实际的Country对象。这只是一个示例,在您的实际控制器中,此处的$country变量将通过表单传递或从数据库中提取等。