许多ZFCUSER学说实体的协会与Bjyauthorize



我正在使用bjyauthorize为我的ZF2项目使用ZFCUSER学说模块,这很好。现在,我想将连接的国家实体从我的用户实体中脱离

在user.php中:

/**
 * An example of how to implement a role aware user entity.
 *
 * @ORMEntity
 * @ORMTable(name="users", indexes={
 *      @ORMIndex(name="fk_User_Country1_idx", columns={"Country_id"}), 
 * }, uniqueConstraints={@ORMUniqueConstraint(name="email_UNIQUE", columns={"email"})})
 * @ORMHasLifecycleCallbacks()
 */
class User implements UserInterface, ProviderInterface
{
...
/**
 * @var ersEntityCountry
 * @ORMManyToOne(targetEntity="Country", inversedBy="users")
 * @ORMJoinColumn(name="Country_id", referencedColumnName="id")
 */
protected $country;

in Country.php

/**
 * EntityCountry
 *
 * @ORMEntity()
 * @ORMTable(name="Country")
 * @ORMHasLifecycleCallbacks()
 */
class Country implements InputFilterAwareInterface
{
...
/**
 * @ORMOneToMany(targetEntity="User", mappedBy="country")
 * @ORMJoinColumn(name="id", referencedColumnName="Country_id")
 */
protected $users;

我的一个控制器之一中的一个简单验证失败:

$user = $em->getRepository("ersEntityEntityUser")
    ->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

我想知道为什么不可能从用户实体中获得国家实体。在同一项目中的其他实体都可以正常工作。

有人可以告诉我需要做些什么才能使该国实体从这个Zfcuser-bjyauthorize-doctrine用户实体中脱颖而出?

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

编辑:

对于没有国家设置的用户,需要有错误。正确的是,需要检查一个国家是否存在。但是该用户有一个国家/地区。我通过phpmyadmin检查了一下。不可能通过getCountry()方法获得这个国家实体。

也许这是因为该学说实体的必要性和序列化为会议。我检查了有关如何将实体保存到会话中的学说文档。但是我想保留会话中的所有次要性,因此,就我而言,我在会话中有一个持有多个软件包实体的订单实体。每个软件包实体都有一个用户和多个项目实体。从会话中获得订单实体时,我希望能够访问所有这些元素。

我什至尝试在会话中对每个用户进行合并:

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

但这并没有改变任何东西。即使是整个订单的合并也没有成功。

您是否对如何使用完整的学说功能从会议中恢复学说实体有想法?

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

我的猜测是ID 1的用户没有国家设置。转到您的表(phpmyadmin或其他),然后检查Country_id列的值。如果您希望每个用户都有一个国家/地区,则可以通过根据Doctrine2 @JoinColumn规格将 nullable=false 添加到联接列定义中来确保数据完整性。

否则(如果允许$countrynull),则应该先检查国家是否是对象,然后才能拉动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

另外一件事,我强烈建议仅使用 persect table 名称的字符串。使用大写可能会给您带来麻烦。

编辑

我仔细看了一下,现在看看您的映射是错误的。您是否使用学说来验证您的模式?关系的反向有一个@ORMJoinColumn(Inside country.php)。反向不需要此@ORMJoinColumn声明。您应该删除此行。拥有的端是用户,因此仅在此处声明JOIN列定义。

应该这样:

country.php:

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

user.php:

/**
 * @var Country
 * @ORMManyToOne(targetEntity="Country", inversedBy="users")
 * @ORMJoinColumn(name="Country_id", referencedColumnName="id")
 */
protected $country;

学说2:可以将实体保存到会话中吗?

这是我问题的答案。

如果在序列化时未加载懒惰的实体,则在除外序列化后将无法加载。因此,您必须在序列化之前确保实体已满载。

如果无法创建一个新的学说实体并获取de-Serializatize的数组副本并将这些数据填充到新实体中。

,仍然存在一个问题。 。

相关内容

  • 没有找到相关文章

最新更新