Doctrine ManyToMany — получить один экземпляр из JoinTable, а не из коллекции

У меня есть две сущности: «А» и «Б» и следующие требования:

  • один «А» относится к нулю или много из B (0-N, oneToMany);
  • один «B» относится к нулю или один «A» (0-1, обнуляемый oneToOne)

Соединение сущности «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;
}

0

Решение

Вы можете решить вашу проблему с помощью Двунаправленный OneToMany A -> B

ManyToOne B -> A означает, что многие B могут использовать один и тот же A … но это гарантирует, что B не может иметь больше ОДНОГО A …

A -> B — это oneToMany … B -> A ManyToOne (обратная сторона) … в этом случае .. A может иметь 0 или более Bs … в этом случае вы также можете установить для обратной стороны значение NULL. .. B не будет знать о каком-либо как …

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]