我有一个问题与我的多对多关系。我想要访问一个querybuilder查询的参考表。对于多对多关系,我不能访问我的引用表,所以我设置了两个一对多关系。我的结构看起来像:
User ---> UserUserCategory <--- UserCategory
上面的结构有两个一对多关系,并且在数据库中工作得很好。当我有一个用户在数据库中具有以下数据(在UserUserCategory中):
Table User
ID | Name
1 | Bart
2 | Gerard
Table Category
ID | Name
1 | Officer
2 | Medic
Table UserUserCategory
User | Category
1 | 1
2 | 2
所以巴特是一名军官,杰拉德是一名医生。但当我想检索数据时,显示巴特是医生,而杰拉德的分类值为"空"
我User-entity:
/**
* Entity Class representing a post of our User module.
*
* @ORMEntity
* @ORMTable(name="user")
* @ORMEntity(repositoryClass="UserRepositoryUserRepository")
*
*/
class User extends zfcUser implements UserInterface
{
/**
* Categories from user
*
* @ORMOneToMany(targetEntity="UserEntityUserUserCategory", mappedBy="user_id", cascade={"remove", "persist"})
* @var UserUserCategory
* @access protected
*/
protected $user_usercategories;
//name & user_id comes here
/**
* Constructor to make a new ArrayCollection for addresses
*
*
*/
public function __construct()
{
$this->user_usercategories = new ArrayCollection();
}
/**
* @param Collection $categories
*/
public function addUserUserCategories(Collection $user_usercategories)
{
foreach ($user_usercategories as $user_usercategorie) {
$user_usercategorie->setUser($this);
$this->user_usercategories->add($user_usercategorie);
}
}
/**
* @param Collection $categories
*/
public function removeUserUserCategories(Collection $user_usercategories)
{
foreach ($user_usercategories as $user_usercategorie) {
$user_usercategorie->setUser(null);
$this->user_usercategories->removeElement($user_usercategorie);
}
}
/**
* @return Collection
*/
public function getUserUserCategories()
{
return $this->categories;
}
}
我UserCategory-entity :
/**
* A User category entity.
* @ORMEntity
* @ORMTable(uniqueConstraints={@ORMUniqueConstraint(name="unique_name_parentId", columns={"name", "parent_id"})})
* @ORMHasLifecycleCallbacks
*/
class UserCategory extends Category
{
/**
* User_usercategories
*
* @ORMOneToMany(targetEntity="UserEntityUserUserCategory", mappedBy="category_id")
* @var UserUserCategory
* @access protected
*/
protected $user_usercategories;
/**
* Constructor
*/
public function __construct()
{
$this->user_usercategories = new ArrayCollection();
}
/**
* @param Collection $categories
*/
public function addUserUserCategories(Collection $user_usercategories)
{
foreach ($user_usercategories as $user_usercategorie) {
$user_usercategorie->setCategory($this);
$this->user_usercategories->add($user_usercategorie);
}
}
/**
* @param Collection $categories
*/
public function removeUserUserCategories(Collection $user_usercategories)
{
foreach ($user_usercategories as $user_usercategorie) {
$user_usercategorie->setCategory(null);
$this->user_usercategories->removeElement($user_usercategorie);
}
}
/**
* @return Collection
*/
public function getUserUserCategories()
{
return $this->categories;
}
}
我UserUserCategory-entity :
/**
* Entity Class representing a post of our User_UserCategory entity.
*
* @ORMEntity
* @ORMTable(name="user_usercategory")
*
*/
class UserUserCategory
{
/**
* User with a category
*
* @ORMManyToOne(targetEntity="UserEntityUser", inversedBy="user_usercategories")
* @ORMJoinColumn(name="user_id", referencedColumnName="user_id", nullable=false, onDelete="CASCADE")
* @ORMId
*
* @var User
* @access protected
*/
protected $user_id;
/**
* Category from user
*
* @ORMManyToOne(targetEntity="UserEntityUserCategory", inversedBy="user_usercategories")
* @ORMJoinColumn(name="category_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
* @ORMId
*
* @var Category
* @access protected
*/
protected $category_id;
public function getUser()
{
return $this->user;
}
/**
* Set User
*
* @param User $user
* @return User
*/
public function setUser(User $user = null)
{
//die('setUser');
$this->user = $user;
return $this;
}
public function getCategory()
{
return $this->category;
}
/**
* Set Category
*
* @param Category $category
* @return Category
*/
public function setCategory(Category $category = null)
{
$this->category = $category;
return $this;
}
}
当我执行下面这行时,它返回了错误的结果。弹出错误的类别:
学说 Util 调试::转储($ this -> getEntityManager() ->找到("用户实体 用户","49")——> user_usercategories);死;
结果:array(1) {
[0]=>
object(stdClass)#452 (3) {
["__CLASS__"]=>
string(28) "UserEntityUserUserCategory"
["user_id"]=>
string(16) "UserEntityUser"
["category_id"]=>
string(24) "UserEntityUserCategory"
}
}
在category_id是打印的医务人员,我希望军官回来。
在我的另一个用户(id=60)中,category_id字段为"null"。所以看起来Doctrine跳过了UserUserCategory中的第一个输入,从第二个输入开始,再也不能得到最后一个类别了。
无意冒犯,但我发现您的代码很难阅读。我建议你做一些修改,这甚至可能有助于你解决问题。
1: Naming:将UserCategory重命名为Category而不是UserCategory。如果你的Category有不同的类型,用像
这样的常量的值创建新的列type class Category
{
const TYPE_USER = 1 ;
....
2:代替addCategories(Collection $array),使用单数版本,如
public function addCategory(Category $category)
{
$reference = new UserCategory() ;
$reference->setUser($this) ;
$reference->setCategory($category) ;
$this->user_categories->add($reference) ;
}
public function removeCategory(Category $category)
{
foreach($this->user_categories as $reference) {
if ( $reference->getCategory() === $category )
$this->user_categories->removeElement($reference) ;
}
}
Symfony2自动识别这样的方法。即使您的关系是复数的(如类别),s2也会找到单数的addCategory和removeCategory方法。
获取类别数组,使用如下命令:
public function getCategories()
{
$categories = new ArrayCollection() ;
foreach($this->user_categories as $reference) {
$categories->add( $reference->getCategory() ) ;
}
return $categories ;
}
如果你这样做,你可能会解决你的问题。