Перевод необработанного SQL-запроса с самостоятельным присоединением к доктрине queryBuilder. - PullRequest
0 голосов
/ 08 октября 2019

Привет, у меня есть запрос sql:

select r.criterion_id, r.logical_state_id, r.created_at from(
select  acr.criterion_id, max(acr.created_at) as max_date  from audit_company_result acr
    where acr.audit_company_id = 42
    group by acr.criterion_id
) as x inner join audit_company_result as r on r.criterion_id = x.criterion_id and r.created_at = x.max_date

Я бы хотел перевести в доктрину форму QueryBuilder. У меня есть лица:

AuditCompany:

class AuditCompany
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="datetime")
     */
    private $createdAt;

    /**
     * @ORM\Column(type="datetime", nullable = true)
     */
    private $startedAt;

    /**
     * @ORM\Column(type="datetime")
     */
    private $plannedEnding;

    /**
     * @ORM\Column(type="datetime", nullable = true)
     */
    private $endingAt;

    /**
     * @ORM\Column(type="boolean")
     */
    private $isCertification;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Company", inversedBy="companyAudits")
     * @ORM\JoinColumn(nullable=false)
     */
    private $company;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Audit", inversedBy="companyAudits")
     * @ORM\JoinColumn(nullable=false)
     */
    private $audit;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\AuditCompanyResult", mappedBy="auditCompany")
     */
    private $auditCompanyResults;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Employee")
     * @ORM\JoinColumn(nullable=false)
     */
    private $responsibleEmployee;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $manualStartedAt;

Критерий:

class Criterion
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    private $info;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @ORM\Column(type="text")
     */
    private $algorithmInfo;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $comparableType;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\CategoryCriterion", inversedBy="criteria")
     * @ORM\JoinColumn(nullable=false)
     */
    private $categoryCriterion;

    /**
     * @ORM\Column(type="text")
     */
    private $logicalMeasureInfo;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\CriterionLogicalStateValue", mappedBy="criterion")
     */
    private $criterionLogicalStateValues;

    /**
     * @ORM\Column(type="boolean")
     */
    private $isAutomatic;

AuditCompanyResult:

class AuditCompanyResult
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Criterion")
     * @ORM\JoinColumn(nullable=false)
     */
    private $criterion;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\AuditCompany", inversedBy="auditCompanyResults")
     * @ORM\JoinColumn(nullable=false)
     */
    private $auditCompany;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $comment;

    /**
     * @ORM\Column(type="boolean")
     */
    private $autoVerified;

    /**
     * @var datetime $created
     *
     * @ORM\Column(name="created_at", type="datetime", nullable = false)
     */
    private $createdAt;

    /**
     * @var datetime $updated
     *
     * @ORM\Column(name="updated_at", type="datetime", nullable = false)
     */
    private $updatedAt;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\CriterionLogicalStateValue")
     * @ORM\JoinColumn(nullable=false)
     *
     */
    private $logicalState;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $criterionValue;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $source;

CriterionLogicalStateValue:

class CriterionLogicalStateValue
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @ORM\Column(type="boolean")
     */
    private $logicalState;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Criterion", inversedBy="criterionLogicalStateValues")
     * @ORM\JoinColumn(nullable=false)
     */
    private $criterion;

Мне удалось написать только подзапрос SQL-запроса, приведенного выше:

$qb = $this->getEntityManager()->getRepository(AuditCompanyResult::class)->createQueryBuilder('acr');
        $result = $qb->select('acr')
            ->addSelect('partial cr.{id}')
            ->addSelect($qb->expr()->max('acr.createdAt'))
            ->leftJoin('acr.criterion','cr')
            ->groupBy('cr.id')
            ->where('acr.auditCompany=42')
            ->getQuery()->getArrayResult();

Я не знаю, как написать весь запрос в QueryBuilder. Существует самостоятельное присоединение. Точно так же, как в статье: https://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

Но как перевести необработанный SQL-запрос в QueryBuilder? Буду благодарен за помощь. С наилучшими пожеланиями

...