原则多租户缺少主键的值(具有 2 个 PK)



我正在为Doctrine开发一个多租户系统。我遇到了一个例外,上面写着

联系人

捆绑\实体\联系人上的主键组 ID 缺少值

我的多租户的工作方式是将来自不同组织的数据与其 groupId 分开。这样,每个组织都可以有一个id=1,并且不会违反任何规则,因为他们的groupId和Id的组合使记录是唯一的。

这意味着您可以拥有

记录 1: id = 1 组 ID = 1

记录 2: id = 1 组 ID = 2

这将是有效的。

我遇到的问题是,我不确定如何在 groupId 中传递它何时为我的关联进行连接,因此它会抛出该错误。由于当前查看的项目的group_id应与为联系人和组织列出的相同,因此如何将当前项目的 groupId 传递到联系人和组织的查询中?这样,它就可以提取正确的记录,并且不会抱怨缺少主键。

下面是列出的项目实体。

<?php
namespace ProjectBundleEntity;
use DoctrineORMMapping as ORM;
/**
* Project
*
* @ORMTable(name="project")
* @ORMEntity(repositoryClass="ProjectBundleRepositoryProjectRepository")
*/
class Project
{
/**
* @var int
*
* @ORMColumn(name="id", type="integer")
* @ORMId
*/
private $id;
/**
* @var string
*
* @ORMColumn(name="name", type="string", length=255)
*/
private $name;
/**
* @var string
*
* @ORMColumn(name="description", type="string", length=2500)
*/
private $description;
/**
* @var int
*
* @ORMOneToOne(targetEntity="ContactBundleEntityContact", inversedBy="projects")
* @ORMJoinColumn(name="contact_id", referencedColumnName="id")
*
*/
private $contactId;

/**
* @var int
*
* @ORMOneToOne(targetEntity="ContactBundleEntityOrganization", inversedBy="projects")
* @ORMJoinColumn(name="organization_id", referencedColumnName="id")
*/
private $organizationId;

/**
* @var int
*
* @ORMColumn(name="group_id", type="integer")
* @ORMId
*/
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;
}

谢谢很多提前的伙计们!

写下我的评论作为答案,因为它们在这里需要更多的空间。所以不,我建议:我建议您将组合键(groupid(的第二部分替换为与组实体的实际关联,而不是手动管理的id字段(https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/tutorials/composite-primary-keys.html#use-case-1-dynamic-attributes(。

至于你最初的问题,我实际上不确定你的问题是什么。如果您有可用的项目实体,则可以通过相关的 getter 直接访问连接的联系人和组织。

我不确定您的关联是否针对您的用例进行了正确定义;您已经为您的项目定义了一对一的关联,这基本上意味着除了一个项目有一个联系人并且属于一个组织之外,反过来,一个联系人只能有一个项目,一个组织只能有一个项目......也就是说,它们听起来应该被定义为多对一关联(?

最新更新