Доктрина мультитенантности отсутствует из первичного ключа (с 2 PK) - PullRequest
0 голосов
/ 20 сентября 2018

Я работаю над мульти-арендной системой для Доктрины.Я столкнулся с исключением, в котором было указано

Отсутствует значение для первичного ключа 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;
}

Спасибо большое, ребята!

1 Ответ

0 голосов
/ 24 сентября 2018

записываю мои комментарии в качестве ответа, так как они требуют здесь немного больше места.Так что нет, я рекомендовал следующее: я рекомендовал, чтобы вы заменили вторую часть вашего составного ключа (groupid) на фактическую связь с объектом группы, а не на поле идентификатора, управляемое вручную (https://www.doctrine -project.org/projects/doctrine-orm/en/2.6/tutorials/composite-primary-keys.html#use-case-1-dynamic-attributes).

Что касается исходного вопроса,Я не совсем уверен, в чем твоя проблема.Если вы хотите, чтобы объект Project был доступен, вы можете напрямую получить доступ к подключенному контакту и организации через соответствующие методы получения.

Я не уверен, правильно ли определены ваши ассоциации для вашего варианта использования или нет;Вы определили ассоциации как один-к-одному для вашего Проекта, что в основном означает, что помимо одного проекта, имеющего один контакт и принадлежащего к одной организации, и наоборот, один контакт может иметь только один проект, и одна организация можеттолько один проект ... Т.е. они звучат так, как будто они должны быть определены как ассоциации ManyToOne (?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...