了解多对多关系

时间:2013-12-24 23:00:22

标签: php symfony doctrine-orm many-to-many

我正在尝试映射一对多的关系,但我有很多问题。 我有以下实体关系模型:

所以,我在Usuario主义模型中写下一个注释:

class Usuario implements UserInterface{
     // Some code...
    /**
     * @ORM\OneToMany(targetEntity="UsuarioComunicacion", mappedBy="usuario")
     */
   protected $contacto;

    // More code...
}

在UsuarioComunicacion模型(N-N表)中:

class UsuarioComunicacion{
    /**
     * @ORM\Id
     * @ORM\Column(name="idusuario", type="integer", length=11)
     * @ORM\ManyToOne(targetEntity="Usuario", inversedBy="contacto")
     * @ORM\JoinColumn(name="idusuario", referencedColumnName="idusuario")
     */
    protected $usuario;

    // More code...
}

但是,当我尝试使用这种关系(进入控制器代码)时,Symfony说:

  

“注意:未定义的索引:usuario in   /var/www/AppsManantiales/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php   第1575行“

我没有太多的经验映射......我不知道发生了什么。 有任何想法吗 ? 谢谢!

更新1

当我尝试获取用户的联系人值时出现问题:

$user->getContacto();

getContacto()是一个自动生成的getter:

/**
 * Get contacto
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getContacto()
{
    return $this->contacto;
}

3 个答案:

答案 0 :(得分:1)

inversedBy课程中的UsuarioComunicacion应为inversedBy="contacto",因为这是变量名称。

答案 1 :(得分:0)

这里有多对多的情况。附加表无法隐藏。这种情况需要一些额外的工作,这不像添加一些ORM语句那么容易。

在下面我只添加了主键属性,因为其余的应该很容易获得。

根据您提供的信息,这是最有用的方法。如果有效,请告诉我。

Usuario:

/**
 * @ORM\Column(name="idusuario", type="integer")
 * @ORM\Id
 */
private $idusuario;

public function setUp()
{
    parent::setUp();
    // some code
    $this->hasMany('Tipocommunicacion as Tipocommunicacions', array(
        'local' => 'idusuario',
        'foreign' => 'idtipocommunicacion',
        'refClass' => 'UsuarioTipcommunicacion'
    ));

}

Tipocommunicacion:

/**
 * @ORM\Column(name="idtipocommunicacion", type="integer")
 * @ORM\Id
 */
private $idtipocommunicacion;

public function setUp()
{
    parent::setUp();
    // some code
    $this->hasMany('Usuario as Usuarios', array(
        'local' => 'idtipocommunicacion',
        'foreign' => 'idusuario',
        'refClass' => 'UsuarioTipocommunicacion'
    ));
}

UsuarioTipocommunicacion:

/**
 * @ORM\Column(name="idusuario", type="integer")
 * @ORM\Id
 */
private $idusuario;

/**
 * @ORM\Column(name="idtipocommunicacion", type="integer")
 * @ORM\Id
 */
private $idtipocommunicacion;

/**
 * @ORM\Column(name="valor", type="string")
 */
private $valor;

答案 2 :(得分:0)

我找到了解决方案。由于某种原因@ORM\Column(...)注释(在UsuarioComunicacion中),关系不起作用。 因此,我删除注释并重命名实例变量:

class UsuarioComunicacion{
    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Usuario", inversedBy="contacto")
     * @ORM\JoinColumn(name="idusuario", referencedColumnName="idusuario")
     */
    protected $idusuario;

    // More code...
}

class Usuario implements UserInterface{
     // Some code...
    /**
     * @ORM\OneToMany(targetEntity="UsuarioComunicacion", mappedBy="idusuario")
     */
   protected $contacto;

    // More code...
}

谢谢你的时间!