【问题标题】:Create associations between entities Doctrine 2在实体之间创建关联 学说 2
【发布时间】:2012-07-18 17:59:58
【问题描述】:

我正在尝试连接 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 功能这样做,但我无法做到。

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

【问题讨论】:

    标签: php orm doctrine doctrine-orm


    【解决方案1】:

    在用户类中替换这个:

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

    这样:

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

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

    仅在 Gender 类中使用:

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

    【讨论】:

    • 我已经完成了,但是......我应该在哪里获得 Gender 类型?获取数据后: $dql = "SELECT a FROM user a"; $query = $em->createQuery($dql); $query->setMaxResults(30); $users = $query->getResult();如果我做一个 print_r($users);我不明白。
    • 我已经完成了,但现在......我在哪里看到类型数据?我没有在 $users 变量上得到它。我如何访问 Gender 类数据?
    • 遍历用户并获取$user->gender
    • 是的,但这样我只能得到性别 ID,而不是性别表的性别类型。
    【解决方案2】:

    可能是题外话,但性别表是无用的。您将永远只有 2 个(男性/女性),所以这样做没有意义。

    您应该在 User 表中创建新列,type=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 个选项,所以只需要一个函数。

    【讨论】:

    • 我设计的系统尽可能地模块化和可扩展。如果我想添加或更改性别名称,或者向该表添加描述或其他任何内容,最好将其放在其他表中。
    【解决方案3】:

    如果你想从查询中得到if,你必须加入性别关系。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 2014-07-15
      • 2018-07-19
      • 1970-01-01
      相关资源
      最近更新 更多