Doctrine ManyToMany - 从 JoinTable 获取一个实例,而不是 Collection
Doctrine ManyToMany - get one instance from JoinTable, not Collection
我有两个实体:"A" 和 "B" 以及下一个要求:
- 一个 "A" 与 B (0-N, oneToMany) 的零个或 多个 相关;
- 一个 "B" 与零相关或 一个 "A"(0-1,oneToOne 可为空)
加入实体"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 ...
我有两个实体:"A" 和 "B" 以及下一个要求:
- 一个 "A" 与 B (0-N, oneToMany) 的零个或 多个 相关;
- 一个 "B" 与零相关或 一个 "A"(0-1,oneToOne 可为空)
加入实体"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 ...