Doctrine ManyToMany - 从 JoinTable 获取一个实例,而不是 Collection

Doctrine ManyToMany - get one instance from JoinTable, not Collection

我有两个实体:"A" 和 "B" 以及下一个要求:

加入实体"AB"已定义,但现在未使用,MySQLtable"AB"用于加入"A"和"B":

CREATE TABLE `AB` (
  `id`   int AUTO_INCREMENT,
  `A_id` int,
  `B_id` int,
  PRIMARY KEY (`id`),
  UNIQUE KEY `A_id_B_id` (`A_id`, `B_id`)
) ENGINE=InnoDB;

下一个代码几乎可以正常工作,但是方法 "B:getAInstance()" returns "A" 的集合:

$b = $em->getRepository('AppBundle:B')->findOneBy(['id' => 1]);
Debug::dump($b->getInstance);

接下来转储:

array (size=1) 0 => 
    object(stdClass)[794]
      public '__CLASS__' => string 'My\Namespace\A' (length=35)

但我只需要 "A" 的一个或零个实例,因此,方法必须 return A 实例或 null。

我尝试建立另一个协会,有或没有 "AB" 实体,但我没有成功。那么,我的代码需要进行哪些更改才能满足要求(额外的 table、实体、注释等)?

奇怪的解决方案是 return $this->aInstance[0] 但这是解决问题的方法。

在下面的代码中,省略了不必要的 getter、setter 和注释。

实体A:

/**
 * @ORM\Table(name="A")
 * @ORM\Entity
 */
class A
{
    /**
     * @var ArrayCollection|A[]
     *
     * @ORM\ManyToMany(
     *      targetEntity="B",
     *      cascade={"all"}
     * )
     * @ORM\JoinTable(
     *      name="AB",
     *      joinColumns={
     *          @ORM\JoinColumn(
     *              name="B_id",
     *              referencedColumnName="id"
     *          )
     *      },
     *      inverseJoinColumns={
     *          @ORM\JoinColumn(
     *              name="A_id",
     *              referencedColumnName="id"
     *          )
     *      }
     * )
     **/
    private $bList;

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

}

实体 B:

/**
 * @ORM\Table(name="B")
 * @ORM\Entity
 */
class B
{
    /**
     * @var A
     *
     * @ORM\ManyToMany(
     *      targetEntity="A",
     *      cascade={"all"}
     * )
     * @ORM\JoinTable(
     *      name="AB",
     *      joinColumns={
     *          @ORM\JoinColumn(
     *              name="A_id",
     *              referencedColumnName="id"
     *          )
     *      },
     *      inverseJoinColumns={
     *          @ORM\JoinColumn(
     *              name="B_id",
     *              referencedColumnName="id"
     *          )
     *      }
     * )
     */
    private $aInstance;

    public function getAInstance()
    {
        return $this->aInstance;
    }
}

实体 AB:

/**
 *
 * @ORM\Table(name="AB")
 * @ORM\Entity
 */
class AB
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var integer
     *
     * @ORM\Column(name="A_id", type="integer", nullable=false)
     */
    private $A_id;

    /**
     * @var integer
     *
     * @ORM\Column(name="B_id", type="integer", nullable=false)
     */
    private $B_id;
}

你可以使用 Bidirectional OneToMany A -> B

来解决你的问题

ManyToOne B -> A 表示ManyToOne B可以共享同一个A...但是会保证一个B不能有多个A...

A -> B 是 oneToMany ... B -> A ManyToOne(反面)...在这种情况下.. A 可以有 0 个或多个 B...您也可以将反面设置为在这种情况下可以为空... B 不会知道任何 As ...