Мое приложение работает на платформе 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».
Кто-нибудь сталкивался с подобной ситуацией?
Спасибо за вашу помощь.