Я пытаюсь оптимизировать получение данных из базы данных вместо того, чтобы Doctrine управлял гидратацией, чтобы минимизировать извлечение данных.
У меня есть объект User
, который содержит много связанных сущностей:
class User
{
/**
* @var integer
*
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
* @Expose()
*/
protected $id;
/**
* @var WorkersDepartments[]|ArrayCollection
*
* @ORM\OneToMany(targetEntity="WorkersDepartments", mappedBy="worker")
*/
protected $departments;
// ... more code
}
Сущность WorkerDepartments
имеет составной ключ: workerId
и departmentId
, но эти параметры не добавляются в класс:
class WorkerDepartments
{
/**
* @var Worker
* @ORM\Id
* @ORM\ManyToOne(targetEntity="Some\Class\Worker", inversedBy="departments")
*/
private $worker;
/**
* @var Department
* @ORM\Id
* @ORM\ManyToOne(targetEntity="Department", inversedBy="workers")
*/
private $department;
/**
* @var integer
* @ORM\Column(type="integer")
*/
private $status;
}
Когда я пытаюсь использовать ResultSetMappingBuilder
и createNativeQuery
метод из Doctrine
только для запроса того, что требуется, я не могу отобразить объединенный объект WorkersDepartments
в объект User
.
После некоторого чтения это, кажется, вызвано неотображение поля id
в объект.
При этом создается объект User
с пустым параметром departments
:
$rsm = new ResultSetMappingBuilder($entityManager);
$rsm->addEntityResult(User::class, 'c')
->addFieldResult('c', 'user_id', 'id');
$rsm->addJoinedEntityResult(WorkersDepartments::class, 'wd', 'c', 'departments')
->addFieldResult('wd', 'status', 'status');
Работает (после добавления параметровк объекту WorkersDepartment
):
$rsm = new ResultSetMappingBuilder($entityManager);
$rsm->addEntityResult(User::class, 'c')
->addFieldResult('c', 'user_id', 'id');
$rsm->addJoinedEntityResult(WorkersDepartments::class, 'wd', 'c', 'departments')
->addFieldResult('wd', 'wd_worker_id', 'workerId');
->addFieldResult('wd', 'wd_department_id', 'departmentId');
->addFieldResult('wd', 'status', 'status');
Таким образом, решением здесь будет добавление параметров в класс, но я бы не стал этого делать, так как это приводит к дублированию данных в объектах и параметрахникогда не будет использоваться.
Do yoВы знаете способ сопоставления объекта WorkersDeparments
без добавления параметров составного ключа в класс?