1

我正在使用 bjyauthorize 为我的 zf2 项目使用 zfcuser 学说模块,它工作得很好。现在我想从我的用户实体中获取连接的国家实体

在 User.php 中:

/**
 * An example of how to implement a role aware user entity.
 *
 * @ORM\Entity
 * @ORM\Table(name="users", indexes={
 *      @ORM\Index(name="fk_User_Country1_idx", columns={"Country_id"}), 
 * }, uniqueConstraints={@ORM\UniqueConstraint(name="email_UNIQUE", columns={"email"})})
 * @ORM\HasLifecycleCallbacks()
 */
class User implements UserInterface, ProviderInterface
{

...

/**
 * @var ersEntity\Country
 * @ORM\ManyToOne(targetEntity="Country", inversedBy="users")
 * @ORM\JoinColumn(name="Country_id", referencedColumnName="id")
 */
protected $country;

在 Country.php 中

/**
 * Entity\Country
 *
 * @ORM\Entity()
 * @ORM\Table(name="Country")
 * @ORM\HasLifecycleCallbacks()
 */
class Country implements InputFilterAwareInterface
{

...

/**
 * @ORM\OneToMany(targetEntity="User", mappedBy="country")
 * @ORM\JoinColumn(name="id", referencedColumnName="Country_id")
 */
protected $users;

我的一个控制器中的一个简单 testAction 失败:

$user = $em->getRepository("ersEntity\Entity\User")
    ->findOneBy(array('id' => 1));
error_log($user->getFirstname().' '.$user->getSurname());
error_log('country: '.$user->getCountry()->getName());

这导致:

[Tue May 19 00:02:44 2015] [error] [client 185.17.207.16] Andi N.
[Tue May 19 00:02:44 2015] [error] [client 185.17.207.16] PHP Fatal error:  Call to a member function getName() on a non-object in /home/ers/www/ers/module/Admin/src/Admin/Controller/TestController.php on line 172

我想知道为什么无法从 User 实体中获取 Country 实体。对于同一个项目中的其他实体,这工作正常。

有人能告诉我需要做什么才能让 Country 实体脱离这个 zfcuser-bjyauthorize-doctrine 用户实体吗?

有关更多代码信息,整个项目可在开发分支的https://github.com/inbaz/ers获得。

编辑:

对于没有设置国家/地区的用户,需要有一个错误。有必要检查一个国家是否存在是对的。但是这个用户有一个国家集。我通过 phpmyadmin 进行了检查。无法通过 getCountry() 方法获取该国家/地区实体。

也许这是导致学说实体反序列化和序列化到会话中的原因。我检查了有关如何将实体保存到会话中的学说文档。但我想保留会话中的所有子实体,所以在我的情况下,我在会话中有一个订单实体,其中包含多个包实体。每个包裹实体都有一个用户和多个项目实体。从会话中获取订单实体时,我希望能够访问所有这些元素。

我什至尝试对会话中的每个用户进行合并,例如:

foreach($participants as $participant) {
    $participant = $em->merge($participant);
}

但这并没有改变任何事情。甚至整个订单的合并也不成功。

您是否知道如何从会话中恢复具有完整学说特征的学说实体?

4

2 回答 2

0

在我看来一切都很好。起初我认为您getCountry的实体定义中缺少您的方法,但我看到它在那里

我的猜测是 id 为 1 的用户没有 Country 集。转到您的表(phpmyadmin或其他)并检查Country_id列的值。如果您希望每个用户都有一个国家/地区,您可以通过nullable=false根据Doctrine2 @JoinColumn规范添加到您的连接列定义来确保您的数据完整性。

否则(如果$country允许null),您可能应该在拉取之前先检查 country 是否是一个对象getName()

$countryName = null;
$country = $user->getCountry();
if(is_object($country)){
    $countryName = $country->getName();
}
/** @var null|string $countryName */
$countryName  //... use your country name which is null or string

还有一件事,我强烈建议只对名和名使用小写字符串。使用大写字母可能会给您带来麻烦。

编辑

我仔细看了看,现在你的映射是错误的。您是否使用教义来验证您的架构?在@ORM\JoinColumn关系的反面(在 Country.php 中)有一个。反面不需要这个@ORM\JoinColumn声明。您应该删除此行。拥有方是用户,所以连接列定义应该只在那里声明。

它应该是这样的:

国家.php:

/**
 * @var Collection
 * @ORM\OneToMany(targetEntity="User", mappedBy="country")
 */
protected $users;

用户.php:

/**
 * @var Country
 * @ORM\ManyToOne(targetEntity="Country", inversedBy="users")
 * @ORM\JoinColumn(name="Country_id", referencedColumnName="id")
 */
protected $country;
于 2015-05-19T07:33:40.883 回答
0

原则 2:实体可以保存到会话中吗?

这是我的问题的答案。

如果延迟加载的实体在序列化时未加载,则在反序列化后将无法加载。因此,您必须确保实体在序列化之前已完全加载。

如果不可能创建一个新的学说实体并获得反序列化的一个数组副本并将这些数据填充到新实体中,那么仍然存在一个问题。

于 2015-05-19T13:20:49.400 回答