4

几分钟前,我在 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;
}

Country、province 和 town 是来自同名表的 id。我尝试使用 ManytoOne 关联更改字段的类型,但它让我在 Doctrine2 生成的 SQL 上出错。这似乎是一个缓存错误,但我无法解决它。

4

2 回答 2

2

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

$ apachectl -M | grep apc
Syntax OK
于 2013-02-08T21:36:48.747 回答
0

关于教义协会如何运作,你有很多东西要学。我建议花一些时间仔细阅读Doctrine mapping 文档

您的用户实体不应该使用这样的整数。相反,您可能想要一种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此处的变量将通过表单传入或从数据库中获取等。

于 2012-12-12T19:21:53.330 回答