Я работаю над мульти-арендной системой для Доктрины.Я столкнулся с исключением, в котором было указано
Отсутствует значение для первичного ключа groupId в ContactBundle \ Entity \ Contact
Работа моей мультитенантности заключается в получении данных изразличные организации, разделенные их группой.Таким образом, каждая организация может иметь id = 1 и не нарушать никаких правил, потому что сочетание их groupId и Id делает запись уникальной.
Это означает, что вы можете иметь
запись 1: id = 1 groupId = 1
запись 2: id = 1 groupId = 2
и этобудет действительным.
Проблема, с которой я сталкиваюсь, заключается в том, что я не уверен, как передать groupId, когда он выполняет объединение для моих ассоциаций, поэтому он выдает эту ошибку.Так как group_id просматриваемого в данный момент проекта должен совпадать с перечисленным для контакта и организации, как бы я мог передать идентификатор группы текущего проекта в запрос для контакта и организации?Таким образом, он получает правильную запись и не жалуется на отсутствие первичного ключа.
Ниже указан мой объект проекта.
<?php
namespace ProjectBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Project
*
* @ORM\Table(name="project")
* @ORM\Entity(repositoryClass="ProjectBundle\Repository\ProjectRepository")
*/
class Project
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="description", type="string", length=2500)
*/
private $description;
/**
* @var int
*
* @ORM\OneToOne(targetEntity="ContactBundle\Entity\Contact", inversedBy="projects")
* @ORM\JoinColumn(name="contact_id", referencedColumnName="id")
*
*/
private $contactId;
/**
* @var int
*
* @ORM\OneToOne(targetEntity="ContactBundle\Entity\Organization", inversedBy="projects")
* @ORM\JoinColumn(name="organization_id", referencedColumnName="id")
*/
private $organizationId;
/**
* @var int
*
* @ORM\Column(name="group_id", type="integer")
* @ORM\Id
*/
private $groupId;
public function __construct($id, $groupId){
$this->id = $id;
$this->groupId = $groupId;
}
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
*
* @return Project
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set description
*
* @param string $description
*
* @return Project
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
/**
* Get description
*
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* Set contactId
*
* @param integer $contactId
*
* @return Project
*/
public function setContactId($contactId)
{
$this->contactId = $contactId;
return $this;
}
/**
* Get contactId
*
* @return int
*/
public function getContactId()
{
return $this->contactId;
}
/**
* Set organizationId
*
* @param integer $organizationId
*
* @return Project
*/
public function setOrganizationId($organizationId)
{
$this->organizationId = $organizationId;
return $this;
}
/**
* Get organizationId
*
* @return int
*/
public function getOrganizationId()
{
return $this->organizationId;
}
}
Я также дам вам, ребята, мои заменители для find () и findAll (), поскольку моя текущая система требует groupId для получения правильной записи.
/**
* @param integer $groupId
* @param integer $id
*/
public function findDataCollection(int $groupId)
{
$qb = $this->repository->createQueryBuilder('e');
$qb
->andWhere('e.groupId = :groupId')
->setParameter('groupId',$groupId);
return $qb->getQuery()->getResult();
}
/**
* @param integer $groupId
* @param integer $id
*/
public function findData(int $groupId, $id)
{
if(empty($id)){
return false;
}
$qb = $this->repository->createQueryBuilder('e');
$qb
->andWhere('e.id = :id')
->andWhere('e.groupId = :groupId')
->setParameter('id', $id)
->setParameter('groupId',$groupId);
$data = $qb->getQuery()->getOneorNullResult();
return $data;
}
Спасибо большое, ребята!