У меня есть две сущности: «А» и «Б» и следующие требования:
Соединение сущности «AB» определено, но не используется в настоящее время, MySQL-таблица «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 ()» возвращает коллекцию «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», поэтому метод должен возвращать экземпляр A или ноль.
Я пытаюсь создать другую ассоциацию, с или без сущности «AB», но мне это не удалось. Итак, какие изменения нужны моему коду для соответствия требованиям (дополнительные таблицы, сущности, аннотации и т. Д.)?
Странное решение — возвращение $this->aInstance[0]
но это путь к проблемам.
В приведенном ниже коде ненужные методы получения, установки и аннотации опущены.
Сущность 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;
}
}
Entity 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;
}
Вы можете решить вашу проблему с помощью Двунаправленный OneToMany A -> B
ManyToOne B -> A означает, что многие B могут использовать один и тот же A … но это гарантирует, что B не может иметь больше ОДНОГО A …
A -> B — это oneToMany … B -> A ManyToOne (обратная сторона) … в этом случае .. A может иметь 0 или более Bs … в этом случае вы также можете установить для обратной стороны значение NULL. .. B не будет знать о каком-либо как …
Других решений пока нет …