ResultSetMapping - как отобразить результат объединенной сущности без ключевого параметра - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь оптимизировать получение данных из базы данных вместо того, чтобы 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 без добавления параметров составного ключа в класс?

...