在实体Doctrine 2之间创建关联

时间:2012-07-18 17:59:58

标签: php orm doctrine doctrine-orm

我正在尝试连接2个实体,我遇到了麻烦。 我有两个类:用户和性别。 每个用户都来自善良的性别(男性或女性)。在我的数据库中,我有两个具有这种结构的表:

 user(**id**, firstName, gender);
 gender(**id**, type);

现在我在我的系统中创建了两个实体。 User.php和Gender.php

用户

<?php  

/**
 * @Entity @Table(name="User")
 **/

class User
{
/**
 * @Id @Column(type="integer") @GeneratedValue
 **/  
private $id;

 /**
 * @Column(type="string")
 **/
private $firstName;

 /**
 * @Column(type="string")
 * @ManyToOne(targetEntity="Gender")
 * @JoinColumn(name="type", referencedColumnName="type")
 * @var Gender[]
 **/
private $gender;


public function __construct($content) {
    $this->setContent($content);
}   


/**
 * @return int
 */
public function getId() {
    return $this->id;
}

/**
 * @return string
 */
public function getFirstName() {
    return $this->firstName;
}

  /**
 * @return int
 */
public function getGender() {
    return $this->gender;
}



/**
 * @param string $content
 */
public function setFirstName($content) {
    $this->firstName = (string) $content;
}

/**
 * @param string $content
 */
public function setGender($content) {
    $this->gender = (string) $content;
}

}

性别

<?php  

/**
 * @Entity @Table(name="Gender")
 **/

class Gender
{
/**
 * @Id @Column(type="integer") @GeneratedValue
 **/  
private $id;

 /**
 * @OneToMany(targetEntity="User", inversedBy="gender")
 * @JoinColumn(name="gender", referencedColumnName="gender")
 * @Column(type="string")
 **/
private $type;


/**
 * @param integer $content
 * 
 */
public function getId() {
    return $this->id;
}

/**
 * @param string $content
 * 
 */
public function getType() {
    return $this->type;
}


/**
 * @param string $content
 */
public function setGender($content) {
    $this->gender = (string) $content;
}

}

我想要的是获取用户时获取性别类型,因此两个实体都必须通过性别类型属性进行连接。 我尝试使用 @ManyToOne @JoinColumn 功能进行此操作,但我无法理解。

我该怎么办?我做错了什么? 谢谢!

3 个答案:

答案 0 :(得分:0)

在用户类中替换它:

* @JoinColumn(name="type", referencedColumnName="type")

与此:

 * @JoinColumn(name="gender", referencedColumnName="type")

您的字段名称是性别,而不是在用户表格中输入。

仅在性别课程中使用:

 * @OneToMany(targetEntity="User", mappedBy="gender")

答案 1 :(得分:0)

可能是offtopic但性别表是没用的。你将永远只有2(男/女)所以没有必要这样做。

您应该在User表中创建新列,键入= integer并使用0/1表示性别。使用像

这样的常量
Class User
{
   const MALE=0 ;
   const FEMALE=1 ;

  .... ORM definition...

 public function isMale()
 {
     return $this->getGender() == self::MALE ;
 }

在控制器中:

if ( !$user->isMale() ) {
    .... buy shoes ....
} else {
    .... buy beer ....
}

或类似的。因为您只有2个选项,所以只需要一个功能。

答案 2 :(得分:0)

如果您想从查询中获取,则必须加入性别关系。

$dql = "SELECT a,g FROM user a LEFT JOIN a.gender g";
$query = $em->createQuery($dql);
$query->setMaxResults(30);
$users = $query->getResult();