【发布时间】:2013-11-18 11:56:57
【问题描述】:
我在让我的学说实体提取到我的 ZF2 表单时遇到问题。我对 ZF2 和 Doctrine(以及类表继承)都很陌生。我已经阅读了几乎所有的 ZF2 和 Doctrine 文档,但似乎仍然无法弄清楚如何让它发挥作用。
为了简单的解释系统,有一个主要的实体叫做Policy。 Policy 实体包括一个 Proposer 实体和一个 PolicyProduct 实体,以及其他几个列。
我在 PolicyProduct 实体中使用类表继承,因为我有 3 种不同的产品类型,每种都需要不同的数据。 3 个产品实体是 TouringCaravan、StaticCaravan 和 Parkhome。
Policy 实体只能有 1 个 Proposer 和 1 个 PolicyProduct。
所有实体的每一列都有 getter 和 setter 方法。
即时显示的表单包括来自 Policy 实体和 PolicyProduct 实体的字段。
为了显示表单,我首先获取策略实体和策略字段集。然后将 Policy Fieldset 设置为基础。
$policyEntity = $entityManager->getRepository('Policy\Entity\Policy')->find($policyId);
$policyFieldset = $formElementManager->get('policy_form_policy_fieldset');
$policyFieldset->setUseAsBaseFieldset(true);
然后我获取 PolicyProduct 特定的字段集并将其添加到 policyFieldset。
eg
$productFieldset = $formElementManager->get('tourers_form_touring_fieldset');
$policyFieldset->add($productFieldset);
然后我将 policyFieldset 添加到表单中,将其与 Policy 实体绑定,并返回完整的表单。
$productForm->add($policyFieldset);
$productForm->bind($policyEntity);
return $productForm;
请注意,我使用DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator 作为每个字段集的水合器。然后我在每个字段集的init() 方法中调用以下内容。
// Example from PolicyFieldset
$hydrator = new DoctrineHydrator($this->objectManager,true);
$this->setHydrator($hydrator)
->setObject(new Policy());
如果我填写表格并保存到数据库,我可以看到数据正确存储在表格中。如果我随后尝试将同一表单与实体水合,则没有任何 PolicyProduct 实体值被映射。但是,策略实体中的值已正确补充。
如果我转储出$policyEntity->getPolicyProduct() 我可以看到所有数据,这意味着实体正在正确保存和检索信息,问题似乎出在我尝试将实体数据提取到表单字段集时。
我希望这是有道理的,但如果没有,请告诉我,我会尽力澄清。
谢谢
这里是主要实体
政策
namespace Policy\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="policy")
*/
class Policy {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Proposer\Entity\Proposer", inversedBy="policy")
* @ORM\JoinColumn(name="proposer_id", referencedColumnName="id")
*
protected $proposer;
/**
* @ORM\ManyToOne(targetEntity="Product")
* @ORM\JoinColumn(name="product_id", referencedColumnName="id", onDelete="RESTRICT")
*/
protected $product;
/**
* @ORM\OneToOne(targetEntity="Policy\Entity\PolicyProduct")
* @ORM\JoinColumn(name="policy_product_id", referencedColumnName="id")
*/
protected $policyProduct;
/**
* @ORM\ManyToOne(targetEntity="PolicyStatus")
* @ORM\JoinColumn(name="policy_status_id", referencedColumnName="id", onDelete="RESTRICT")
*/
protected $policyStatus;
/**
* @ORM\Column(name="policyInception", type="date", nullable=true)
*/
protected $policyInception;
// Omitted getters and setters
}
政策产品
namespace Policy\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="policy_product")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="productDiscriminator", type="integer")
* @ORM\DiscriminatorMap({1 = "Tourers\Entity\TouringCaravan", 2 = "Statics\Entity\StaticCaravan", 3 = "Parkhomes\Entity\Parkhome"})
*/
class PolicyProduct {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
// Omitted getters and setters
}
TouringCaravan - PolicyProduct 继承表示例
namespace Tourers\Entity;
use Doctrine\ORM\Mapping as ORM;
use Policy\Entity\PolicyProduct;
/**
* @ORM\Entity
* @ORM\Table(name="touring_caravan")
*/
class TouringCaravan extends PolicyProduct {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\OneToOne(targetEntity="Policy\Entity\Policy")
* @ORM\JoinColumn(name="policy_id", referencedColumnName="id")
*/
protected $policy;
/**
* @ORM\ManyToOne(targetEntity="TouringCaravanMake")
* @ORM\JoinColumn(name="touring_caravan_make", referencedColumnName="id", onDelete="RESTRICT")
*/
protected $caravanMake;
/**
* @ORM\Column(name="caravanModel", type="string", length=128, unique=false, nullable=false)
*/
protected $caravanModel;
....
Lots more columns specific to the TouringCaravan Entity
// Omitted getters and setters
}
【问题讨论】:
标签: php doctrine-orm zend-framework2 zend-form class-table-inheritance