регистрозависимые идентификаторы в Doctrine - PullRequest
1 голос
/ 05 июля 2019

Мое приложение работает на платформе Symfony с базой данных Doctrine и MSSQL. У меня есть таблица с пользователями, где идентификаторы - это строки (3 символа), например, mni, mdr, owu и т. Д. В других связанных таблицах я использую эти идентификаторы, но иногда эти идентификаторы сохраняются заглавными буквами (например, MNI) или строчными буквами (например, owu).

Пример таблицы:

| ID | Name        | Description | CreatedBy | UpdatedBy |
|----|-------------|-------------|-----------|-----------|
| 1  | Something 1 | Desc 1      | mni       | OWU       |
| 2  | Something 2 | Desc 2      | mni       | MNI       |
| 3  | Something 3 | Desc 3      | MDR       | mdr       |

Моя проблема в том, что когда я получаю данные из таблицы, как указано выше, я не получаю полную информацию о связанных пользователях. Например, когда я выбираю запись с идентификатором 2, у меня есть только информация о том, кто обновил объект (у меня есть доступ к информации об этом пользователе), но кто создал объект, я получаю пустой пользовательский объект (без данных). В профилировщике я заметил, что Doctrine выполняет два запроса (для пользователя с «mni» и для пользователя с «MNI»), но я получаю только информацию об одном из них (даже если это один и тот же пользователь).

На мой взгляд, Doctrine рассматривает "mni" и "MNI" как два разных объекта, но это один и тот же пользователь.

Это код сущности с пользователем:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity()
 * @ORM\Table(name="users")
 *
 * @UniqueEntity("id")
 */
class User
{
    /**
     * @var string|null - 3-characters user shortname
     *
     * @Assert\NotBlank()
     * @Assert\Length(max="50")
     *
     * @ORM\Id()
     * @ORM\Column(name="id", type="string", length=50)
     */
    private $id;

    /**
     * @var string|null - Firstname
     *
     * @Assert\Length(max="50")
     *
     * @ORM\Column(name="firstname", type="string", length=50, nullable=true)
     */
    private $firstName;

    /**
     * @var string|null - Lastname
     *
     * @Assert\Length(max="50")
     *
     * @ORM\Column(name="lastname", type="string", length=50, nullable=true)
     */
    private $lastName;

    /**
     * @return string
     */
    public function __toString()
    {
        return (string) null !== $this->getId() ? ('['.$this->getCode().'] '.$this->getFirstName().' '.$this->getLastName()) : '';
    }

    /**
     * @return string|null
     */
    public function getId(): ?string
    {
        return $this->id;
    }

    /**
     * @param string $id
     *
     * @return User
     */
    public function setId(string $id): User
    {
        $this->id = $id;

        return $this;
    }

    /**
     * @return string|null
     */
    public function getFirstName(): ?string
    {
        return $this->firstName;
    }

    /**
     * @param string|null $firstName
     *
     * @return User
     */
    public function setFirstName(?string $firstName): User
    {
        $this->firstName = $firstName;

        return $this;
    }

    /**
     * @return string|null
     */
    public function getLastName(): ?string
    {
        return $this->lastName;
    }

    /**
     * @param string $lastName
     *
     * @return User
     */
    public function setLastName(?string $lastName): User
    {
        $this->lastName = $lastName;

        return $this;
    }
}

Это код сущности другого связанного объекта (например, Project):

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity()
 * @ORM\Table(name="projects")
 */
class Project
{
    /**
     * @var int|null
     *
     * @ORM\Id()
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @ORM\Column(name="id", type="integer")
     */
    private $id;

    /**
     * @var string|null - Project name
     *
     * @Assert\NotBlank()
     * @Assert\Length(max="50")
     *
     * @ORM\Column(name="name", type="string")
     */
    private $name;

    /**
     * @var string|null - Project description
     *
     * @ORM\Column(name="description", type="text")
     */
    private $description;

    /**
     * @var User|null - Who created
     *
     * @ORM\ManyToOne(targetEntity="App\Entity\User")
     * @ORM\JoinColumn(name="created_by", referencedColumnName="id")
     */
    private $createdBy;

    /**
     * @var User|null - Who updated
     *
     * @ORM\ManyToOne(targetEntity="App\Entity\User")
     * @ORM\JoinColumn(name="updated_by", referencedColumnName="id")
     */
    private $updatedBy;

    /**
     * @return string
     */
    public function __toString()
    {
        return (string) $this->getId() ? '#'.$this->getId() : '';
    }

    /**
     * @return int|null
     */
    public function getId(): ?int
    {
        return $this->id;
    }

    /**
     * @return string|null
     */
    public function getName(): ?string
    {
        return $this->name;
    }

    /**
     * @param string $name
     *
     * @return Project
     */
    public function setName(string $name): Project
    {
        $this->name = $name;

        return $this;
    }

    /**
     * @return string|null
     */
    public function getDescription(): ?string
    {
        return $this->description;
    }

    /**
     * @param string|null $description
     *
     * @return Project
     */
    public function setDescription(?string $description): Project
    {
        $this->description = $description;

        return $this;
    }

    /**
     * @return User|null
     */
    public function getCreatedBy(): ?User
    {
        return $this->createdBy;
    }

    /**
     * @param User|null $createdBy
     *
     * @return Project
     */
    public function setCreatedBy(?User $createdBy): Project
    {
        $this->createdBy = $createdBy;

        return $this;
    }

    /**
     * @return User|null
     */
    public function getUpdatedBy(): ?User
    {
        return $this->updatedBy;
    }

    /**
     * @param User|null $updatedBy
     *
     * @return Project
     */
    public function setUpdatedBy(?User $updatedBy): Project
    {
        $this->updatedBy = $updatedBy;

        return $this;
    }
}

Когда я получаю объект Project и выгружаю этот объект, я получаю следующее:

Project {#336 ▼
  -id: 2
  -name: "Something 2"
  -description: "Desc 2"
  -createdBy: User {#356 ▼
    +__isInitialized__: false
    -code: "MNI"
    -firstName: null
    -lastName: null
     …2
  }
  -updatedBy: User {#355 ▼
    +__isInitialized__: true
    -code: "mni"
    -firstName: "John"
    -lastName: "Doe"
     …2
  }
}

Обратите внимание, что объект User из "createBy" имеет другой идентификатор объекта (# 356), чем объект User из "updatedBy" (# 355).

Когда я хочу получить, например, имя пользователя, создавшего Project, я получаю значение NULL, но когда я хочу получить имя пользователя, обновившего Project, я получаю «John».

Кто-нибудь сталкивался с подобной ситуацией? Спасибо за вашу помощь.

...