我正在尝试连接两个实体,但遇到了问题。我有两个班:用户和性别。每个用户都来自一种性别(男性或女性)。在我的数据库中,我有两个具有这种结构的表:
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功能来做到这一点,但我无法获得。
我该怎么做?我做错了什么?谢谢
将其替换为用户类:
* @JoinColumn(name="type", referencedColumnName="type")
其中:
* @JoinColumn(name="gender", referencedColumnName="type")
您的字段名称是性别,而不是在用户表中键入。
仅在性别类别中使用:
* @OneToMany(targetEntity="User", mappedBy="gender")
可能会偏离主题,但性别表是无用的。你永远只有两个(男/女),所以这样做没有意义。
您应该在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 ....
}
或者类似的。因为您只有两个选项,所以只需要一个功能。
如果要从查询中获取if,则必须加入性别关系。
$dql = "SELECT a,g FROM user a LEFT JOIN a.gender g";
$query = $em->createQuery($dql);
$query->setMaxResults(30);
$users = $query->getResult();