【问题标题】:Symfony 2.0 Doctrine entities setter doesn't workSymfony 2.0 Doctrine 实体设置器不起作用
【发布时间】:2014-07-26 15:35:29
【问题描述】:

我有一个带有字段的表 Absence 的数据库:id、日期、持续时间、user_id、typ_id.. 我还有 2 个表 User 和 AbsenceTyp。带有 *_id 的所有内容都被定义为相应表的 FK。

我生成了 getter/setter 并使用以下命令更新了我的数据库:

php app/console doctrine:generate:entities MyTestBundle
php app/console doctrine:schema:update --force

(没有产生任何错误...)

现在通过保存缺席:

$ab = new Absence();
$ab->setUserId(1);
$ab->setDate($date);
$ab->setDuration('0.5');
$ab->setTypId(2);

$em->persist($ab);
$em->flush();

...它导致了这个 sql 语句:

'INSERT INTO absence (date, duration, user_id, typ_id) VALUES (?, ?, ?, ?)' with params ["2014-07-07", "0.5", null, null]:

所有 FK 的 Setter 都不起作用...但是 Getter 完美地完成了他们的工作(例如 getTypId()) 有任何想法吗?这是我的缺席实体:

<?php
namespace MyTest\Bundle\MainBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="AbsenceRepository")
 * @ORM\Table(name="absence", indexes={@ORM\Index(name="fk_absence_user", columns=        {"user_id"}), @ORM\Index(name="fk_absence_absencetyp", columns={"typ_id"})})
 */
class Absence
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @ORM\Column(type="date", nullable=false)
 */
protected $date;

/**
 * @ORM\Column(type="decimal", precision=5, scale=2, nullable=false)
 */
protected $duration;

/**
 * @ORM\Column(type="integer", nullable=false)
 */
protected $user_id;

/**
 * @ORM\ManyToOne(targetEntity="MyTest\Bundle\UserBundle\Entity\User", inversedBy="absences")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 */
protected $user;

/**
 * @ORM\Column(type="integer", nullable=false)
 */
protected $typ_id;

/**
 * @ORM\ManyToOne(targetEntity="MyTest\Bundle\MainBundle\Entity\AbsenceTyp", inversedBy="absences")
 * @ORM\JoinColumn(name="typ_id", referencedColumnName="id")
 */
protected $absenceTyp;

... // generated Getter / Setters

【问题讨论】:

  • 我还尝试通过以下方式更改命名策略:naming_strategy:doctrine.orm.naming_strategy.underscore
  • 您可能应该首先了解教义中的关联。您不需要 user_id 和 user 属性。与类型相同

标签: php symfony orm doctrine-orm setter


【解决方案1】:

当您有 JOIN 关系时,您必须使用对象设置器来设置连接列的值。例如,要设置 user_id 字段的值,您需要使用 ->setUser($userObject) setter 而不是 setUserId()。

实际上不需要在您的实体中指定 $user_id 字段。如果您需要在 SELECT 期间从数据库中直接访问 user_id 值,而不必获取用户对象,这样做有时会很有用。

您的代码可能如下所示:

$user = new User(); //fake user or real user object if you have it fetched from db already
$user->setId(5);

$ab = new Absence();
$ab->setUser($user);
// ... set other fields
$em->persist($ab);
$em->flush();

【讨论】:

  • 你先生拯救了我的夜晚 :-) 谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多