![](/img/trans.png)
[英]Symfony2 & Doctrine - Lazy load an entity's property through a service
[英]symfony2/doctrine entity property not filled
在執行createQueryBuilder學說之后,我得到的結果帶有未填充對象的屬性。
這是我的代碼
在UserSecurityManager中(服務)
... $repository = $this->em->getRepository('VenusUserBundle:Role');
$query = $repository->createQueryBuilder('r')
->where('r.lft >= :role_lft AND r.rgt <= :role_rgt')
->orderBy('r.rgt', 'ASC')
->setParameter('role_lft', $result['lft'])
->setParameter('role_rgt', $result['rgt'])
->getQuery();
$availableRoles = $query->getResult(); ...
//debug
foreach ($availableRoles as $key => $value) { echo '<br>CODE='.$value->getCode().' LFT='.$value->getLft().' NAME=('.$value->getName().') * '; }
...
角色類別
namespace MyApp\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\Role\RoleInterface;
/**
* @ORM\Entity
* @ORM\Table(name="Role")
*/
class Role implements RoleInterface, \Serializable
{
/**
* @ORM\Id
* @ORM\Column(type="string", length=100)
*
* @var string $code
*/
protected $code;
/**
* @ORM\Column(name="name", type="string", length=100)
*
* @var string $name
*/
private $name;
/**
* @ORM\Column(type="integer")
*
* @var integer $lft
*/
protected $lft; //nested tree
/**
* @ORM\Column(type="integer")
*
* @var integer $rgt
*/
protected $rgt; //nested tree
/**
* @ORM\OneToMany(targetEntity="Role", mappedBy="parent")
*/
private $children;
/**
* @ORM\ManyToOne(targetEntity="Role", inversedBy="children")
* @ORM\JoinColumn(name="parent_code", referencedColumnName="code")
*/
private $parent;
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="roles")
*
* @var \Doctrine\Common\Collections\ArrayCollection
*/
protected $users;
public function __construct()
{
$this->name = '';
$this->users = new \Doctrine\Common\Collections\ArrayCollection();
$this->children = new \Doctrine\Common\Collections\ArrayCollection();
}
// @see \Serializable::serialize()
public function serialize()
{
// ! Don't serialize $users field !
return \serialize(array(
$this->code,
$this->name,
$this->parent,
$this->children,
));
}
// @see \Serializable::unserialize()
public function unserialize($serialized)
{
list(
$this->code,
$this->name,
$this->parent,
$this->children,
) = \unserialize($serialized);
}
//public function __toString() {
// return $this->name;
//}
/**
* Sets the role code.
*
* @param string $value The code.
*/
public function setCode($value)
{
$this->code = $value;
}
/**
* Gets the code.
*
* @return integer The code.
*/
public function getCode()
{
return $this->code;
}
/**
* Gets the role name.
*
* @return string The name.
*/
public function getName()
{
return $this->name;
}
/**
* Sets the role name.
*
* @param string $name The name.
*/
public function setName($name)
{
$this->name = $name;
}
/**
* Get parent
*
* @return MyApp\UserBundle\Entity\Role
*/
public function getParent()
{
return $this->parent;
}
/**
* Set parent
*
* @param MyApp\UserBundle\Entity\Role $role
*/
public function setParent(\MyApp\UserBundle\Entity\Role $role)
{
$this->parent = $role;
}
/**
* Gets the role left.
*
* @return string The left.
*/
public function getLft()
{
return $this->lft;
}
/**
* Sets the role left.
*
* @param string $left Left.
*/
public function setLft($lft)
{
$this->lft = $lft;
}
public function getRole()
{
return $this->code;
}
/**
* Remove a user
*
* @param \MyApp\UserBundle\Entity\User $user
*/
public function removeUser(\MyApp\UserBundle\Entity\User $user)
{
$this->users->removeElement($user);
}
/**
* Add a user
*
* @param \MyApp\UserBundle\Entity\User $user
*/
public function addUser(\MyApp\UserBundle\Entity\User $user)
{
$this->users->add($user);
}
/**
* Remove all users
*
*/
public function removeUsers()
{
$this->users->clear();
}
/**
* Set the collection of related users
*
* @param \Doctrine\Common\Collections\ArrayCollection $users
*/
public function setUsers(\Doctrine\Common\Collections\ArrayCollection $users)
{
$this->users = $users;
}
/**
* Get users
*
* @return Doctrine\Common\Collections\Collection
*/
public function getUsers()
{
return $this->users;
}
}
線
foreach ($availableRoles as $key => $value) {
echo '<br>CODE='.$value->getCode().' LFT='.$value->getLft().' NAME=('.$value->getName().') * '; }
顯示
CODE=client LFT=4 NAME=(client) *
CODE=studio LFT=6 NAME=(studio) *
CODE=commercial LFT=8 NAME=(commercial) *
CODE=user_manager LFT=11 NAME=(user manager) *
CODE=company_manager LFT=13 NAME=(company manager) *
CODE=admin LFT=3 NAME=(administrator) *
CODE=prod LFT=10 NAME=(prod) *
CODE=superadmin LFT= NAME=() * //<-- THE BUG : name is empty !!!
CODE=root LFT=1 NAME=(megaroot) *
以及數據庫中的數據:
code parent_code name lft rgt
admin superadmin administrator 3 15
client admin client 4 5
commercial admin commercial 8 9
company_manager admin company manager 13 14
prod admin prod 10 15
root NULL megaroot 1 18
studio admin studio 6 7
superadmin root superadmin 2 15
user_manager admin user manager 11 12
對於超級管理員,我不理解屬性“名稱”是否填寫。
你有想法嗎 ?
我做了其他測試:
如果角色“管理員”的父級是角色“客戶端”
code parent_code name lft rgt
admin client administrator 3 15
client admin client 4 5
commercial admin commercial 8 9
company_manager admin company manager 13 14
prod admin prod 10 15
root NULL megaroot 1 18
studio admin studio 6 7
superadmin root superadmin 2 15
user_manager admin user manager 11 12
CODE=client LFT= NAME=() * <-- BUG HERE !!!
CODE=studio LFT=6 NAME=(studio) *
CODE=commercial LFT=8 NAME=(commercial) *
CODE=user_manager LFT=11 NAME=(user manager) *
CODE=company_manager LFT=13 NAME=(company manager) *
CODE=admin LFT=3 NAME=(administrator) *
CODE=prod LFT=10 NAME=(prod) *
CODE=superadmin LFT=2 NAME=(superadmin) *
CODE=root LFT=1 NAME=(megaroot) *
如果角色“管理員”的父級是角色“客戶端”,而角色“ client”的父級是角色“根”
code parent_code name lft rgt
admin client administrator 3 15
client admin client 4 5
commercial admin commercial 8 9
company_manager admin company manager 13 14
prod admin prod 10 15
root NULL megaroot 1 18
studio admin studio 6 7
superadmin root superadmin 2 15
user_manager admin user manager 11 12
CODE=client LFT= NAME=() * <-- BUG HERE !!!
CODE=studio LFT=6 NAME=(studio) *
CODE=commercial LFT=8 NAME=(commercial) *
CODE=user_manager LFT=11 NAME=(user manager) *
CODE=company_manager LFT=13 NAME=(company manager) *
CODE=admin LFT=3 NAME=(administrator) *
CODE=prod LFT=10 NAME=(prod) *
CODE=superadmin LFT=2 NAME=(superadmin) *
CODE=root LFT= NAME=() * <-- BUG HERE !!!
謝謝你,我的英語不好意思。
菲爾
如果我執行
$query->setHint(\Doctrine\ORM\Query::HINT_REFRESH, true);
之前
$availableRoles = $query->getResult();
好的,結果很好,但我還不知道原因:s。
問題來自我的代碼? 還是這是教義2.4中的錯誤?
教義緩存會出現問題。 當我在執行查詢之前調用此“ entitymanager-> clear()”時,一切都很好。
$this->em->clear('MyApp\UserBundle\Entity\Role');
$repository = $this->em->getRepository('MyAppUserBundle:Role');
對這個緩存問題有什么解釋? 因為我沒有在symfony項目中配置緩存。
“ em-> clear()”對其余應用程序來說很危險嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.