使用Symfony关联映射不起作用的学说

时间:2017-01-21 03:20:16

标签: php doctrine-orm symfony

[注意]我只是学习教义和symfony 3.

问:如果符合以下条件,我的学说会有什么关系:

我有Company个实体,我想将它与Sub_agent实体相关联。

用户将从我的Company实体执行添加/编辑/删除,同样适用于我的Sub_agent实体。在我的Sub_agent表单中,有Company的下拉列表,用户必须选择将sub_agent与公司关联。

Company实体

 -------------
| id  | name  |
--------------
| 1   | ABCD  |
| 2   | EFGH  |
 -------------

Sub-Agent实体

 ------------------------------------
| id  | sub_agent_name | company_id  |
-------------------------------------
| 1   | ABAKADA        |   1         | 
| 2   | EGAHA          |   2         |
 ------------------------------------

用户记录:子代理表

----------------------
id |  Name   | Company|
-----------------------
1  | ABAKADA | ABCD   |
2  | EGAHA   | EFGH   |
----------------------     

我做的是,

更新我的代码

子代理实体

namespace SwipeBundle\Entity;

use Doctrine\ORM\Mapping as ORM;


/**
 * Sub_agent
 *
 * @ORM\Table(name="sub_agent")
 * @ORM\Entity(repositoryClass="SwipeBundle\Repository\Sub_agentRepository")
 */
class Sub_agent
{

    /**
     * Many Sub-agents have One Company.
     * @ORM\ManyToOne(targetEntity="Company", inversedBy="sub_agent")
     * @ORM\JoinColumn(name="company_id", referencedColumnName="id")
     */
    private $companyId;

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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



    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     *
     * @return Sub_agent
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set companyId
     *
     * @param string $companyId
     *
     * @return Sub_agent
     */
    public function setCompanyId($companyId)
    {
        $this->companyId = $companyId;

        return $this;
    }

    /**
     * Get companyId
     *
     * @return string
     */
    public function getCompanyId()
    {
        return $this->companyId;
    }

}

公司实体

namespace SwipeBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Company
 *
 * @ORM\Table(name="company")
 * @ORM\Entity(repositoryClass="SwipeBundle\Repository\CompanyRepository")
 * @ORM\HasLifecycleCallbacks()
 */

class Company
{

    /**
     * @ORM\OneToMany(targetEntity="Sub_agent", mappedBy="companyId")
     */
    protected $sub_agent;

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     *
     * @return Company
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }
}

1 个答案:

答案 0 :(得分:0)

您需要像这样导入映射:

use Doctrine\ORM\Mapping as ORM;

然后改变你的$ company注释:

/**
 * One Sub-agent has One Company.
 * @ORM\OneToOne(targetEntity="Company", inversedBy="sub_agent")
 * @ORM\JoinColumn(name="company_id", referencedColumnName="id")
 */
private $company;

尝试一下,我认为它应该有用。

编辑#2 - 基于评论。

向公司实体添加相同的使用声明,并添加

/**
 * @ORM\OneToOne(targetEntity="Sub_agent", mappedBy="company")
 */
protected $sub_agent;

似乎Doctrine文档不正确。我和你之前的尝试一样,也遇到了错误。

编辑#3:

您需要添加:

use Doctrine\Common\Collections\ArrayCollection;

致公司实体,以及构造函数:

public function __construct() {
  $this->sub_agent = new ArrayCollection();
}

$companyId更改回$company。你误解我了。  您需要setter和getter才能将Sub_agents设置为公司,如下所示:

/**
* Set sub_agent
*
* @param \SwipeBundle\Entity\Sub_agent $subAgent
*
* @return Application
*/
public function setSubAgent(\SwipeBundle\Entity\Sub_agent $subAgent = null)
{
  $this->sub_agent = $subAgent;

  return $this;
}

/**
* Get sub_agent
*
* @return \SwipeBundle\Entity\Sub_agent
*/
public function getSubAgent()
{
  return $this->sub_agent;
}