我在让我的学说实体提取到我的 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 实体和 Policy Fieldset。然后将 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
用作每个字段集的 hydrator。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
}