繁体   English   中英

了解多对多关系

[英]Understanding many to many relationships

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

因此,我在Usuario理论模型中编写下一个注释:

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

    // More code...
}

在UsuarioCommunicacion模型(NN表)中:

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说:

“通知:未定义的索引:/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;
}

inversedByUsuarioComunicacion类应该是inversedBy="contacto" ,因为这是变量名。

您在这里有很多对很多情况。 附加表无法将其隐藏。 这种情况下需要做一些额外的工作,而这些工作并不像添加一些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;

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

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...
}

谢谢你的时间 !

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM