【问题标题】:Understanding many to many relationships了解多对多关系
【发布时间】:2013-12-24 23:00:22
【问题描述】:

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

所以,我在 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;
}

【问题讨论】:

  • 尝试将 mappedBy="usuario" 更改为 mappedBy="Usuario",它应该可以工作
  • @Satya thnaks 回复,但不起作用:(

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    根据您提供的信息,这是最有用的方法。让我知道它是否有效。

    乌苏里奥:

    /**
     * @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'
        ));
    
    }
    

    交流:

    /**
     * @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;
    

    【讨论】:

      【解决方案3】:

      我找到了解决方案。由于某种原因,@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...
      }
      

      感谢您的宝贵时间!

      【讨论】:

        猜你喜欢
        • 2018-07-16
        • 2011-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-25
        • 1970-01-01
        • 2014-06-09
        • 2018-06-15
        相关资源
        最近更新 更多