Это не будет работать таким образом.EntityManager
Doctrine поддерживает только управление объектами в пределах одной базы данных, поэтому ваше отношение между базами данных между ta
и tb
не будет установлено.Пожалуйста, обратитесь к этой проблеме в Doctrine bug tracker для получения дополнительной информации.
Однако ваша цель может быть достигнута несколько иным способом.Вы не можете установить связи между базами данных между сущностями, но вы, конечно, можете хранить идентификаторы, которые ссылаются на сущности в разные базы данных.Следовательно, вы можете переместить всю логику связей между базами данных в репозитории.Например, предположим, что у вас есть 2 EntityManager
для каждой базы данных: $accEm
для acc
базы данных и $tradeEm
для trade
базы данных.Принимая во внимание, что вы используете Symfony - их можно настроить в конфигурации DoctrineBundle
, а затем внедрить в службы.
Вам потребуется внести некоторые изменения в код:
ta.php , я опустил большую часть кода, чтобы выразить изменения, которые необходимо внести.
namespace AppBundle\Entity;
class ta
{
/**
* @ORM\Column(type="integer", nullable=true)
* @var int
*/
private $tb_table; // Notice that it is not a reference anymore, but simple integer
/**
* Set tbTable.
*
* @param \AppBundle\EntityTrade\tb|null $tbTable
*
* @return ta
*/
public function setTbTable(\AppBundle\EntityTrade\tb $tbTable = null)
{
// You can also consider updating this method to accept plain integers aswel
$this->tb_table = $tbTable instanceof \AppBundle\EntityTrade\tb ? $tbTable->getId() : null;
return $this;
}
/**
* Get tbTable.
*
* @return int|null
*/
public function getTbTable()
{
// Also notice that plain integer is returned, you may want to rename column and method names to reflect this change of column meaning
return $this->tb_table;
}
}
taRepository.php , я также опустил большую частькод, который может быть там
namespace AppBundle\Entity;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;
class taRepository extends EntityRepository {
/**
* @var EntityManager
*/
private $tradeEm;
/**
* @param EntityManager $tradeEm
*/
public function setTradeEntityManader(EntityManager $tradeEm)
{
// It is required to pass instance of EntityManager for "trade" database here. It should be done via Symfony services configuration, please refer Symfony documentation on this topic if needed
$this->tradeEm = $tradeEm;
}
/**
* @param ta $ta
* @return \AppBundle\EntityTrade\tb|null
*/
public function getTbTable(ta $ta) {
// This method should be used instead of $ta::getTbTable()
$tbId = $ta->getTbTable();
if ($tbId === null) {
return null;
}
return $this->tradeEm->find(\AppBundle\EntityTrade\tb::class, $tbId);
}
}
defaultController.php
namespace AppBundle\Controller;
use Doctrine\ORM\EntityManager;
class defaultController
{
/**
* @var EntityManager
*/
private $tradeEm;
/**
* @param EntityManager $tradeEm
*/
public function __construct(EntityManager $tradeEm)
{
// Same as before, this should be instance of EntityManager for "trade" database
$this->tradeEm = $tradeEm;
}
public function indexAction()
{
$em = $this->getDoctrine()->getRepository(ta::class, 'customer');
$ta = $em->find(2);
// Notice that we're not receiving "trade" database entity directly, but using corresponding EntityManager instead
$tb = $this->tradeEm->getTbTable($ta);
if ($tb !== null) {
$szName = $tb->getName();
}
}
}