【问题标题】:Doctrine2 don't persist some fieldsDoctrine2 不坚持某些领域
【发布时间】:2012-12-12 16:20:35
【问题描述】:

几分钟前我发现 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 上出错。好像是缓存错误,但是我解决不了。

【问题讨论】:

  • 您是否尝试清除缓存?
  • 你能展示实体的 Doctrine 配置(注解、yml 等)吗?您确定为新字段设置了正确的“ORM/列”吗?
  • 使用控制台清除元数据缓存是不够的。在开发中,您可以使用 VoidCache 禁用缓存。这对我有帮助

标签: php symfony doctrine-orm persist


【解决方案1】:

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

$ apachectl -M | grep apc
Syntax OK

【讨论】:

    【解决方案2】:

    关于教义关联的运作方式,您需要学习很多东西。我建议花点时间认真阅读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 变量将通过表单传入或从数据库中获取等。

    【讨论】:

    • 非常感谢!我在 Docrtine2 上开发了 1 年,我知道如何更新架构。我已经尝试过 ManyToOne 关系,但是当我进行这样的简单查询时,Doctrine2 给了我错误: $user = $em->getRepository('HomeBundle:Users')->findOneBy(array('id' => $uid) ); Doctrine 给了我一个 SQLSTATE[42S22] 错误,因为国家字段被重命名为 contruy_id(ManytoOne 自动列名)。其他表没有错误,我不明白为什么这个表会出现这个错误。
    • 如果您使用 APC 或 memcached 等,您可能需要尝试重新启动 apache 进程(如果可以的话)。我过去在更新 Doctrine 映射后遇到了问题,我有时会收到 SQL 错误,因为 APC 缓存了原则类,唯一的解决方法是重新加载 apache(这会清除 APC cahce)。
    • 哦!谢谢!这是解决方案!我知道问题出在缓存上,但没想到重新启动 apache 会擦除 APC。再次感谢!
    猜你喜欢
    • 2014-01-25
    • 2021-03-20
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 2017-12-14
    相关资源
    最近更新 更多