我正在使用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
添加到联接列定义中来确保数据完整性。
否则(如果允许$country
为null
),则应该先检查国家是否是对象,然后才能拉动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的数组副本并将这些数据填充到新实体中。