簡體   English   中英

symfony2 / doctrine實體屬性未填寫

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM