рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░рд┐рдгрд╛рдо

рдбреЙрдХреНрдЯреНрд░рд┐рди рдУрдЖрд░рдПрдо рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдбреЗрдЯрд╛ рд▓рд╛рдиреЗ рдХреЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рд╛рдзрди рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддрд╛ рд╣реИред рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА DQL рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХреНрд╡реЗрд░реА рдмрд┐рд▓реНрдбрд░ , рд╕рд░рд▓ рдФрд░ рд╕рд╣рдЬ рд╣реИред рд╡реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА SQL рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ DBMS рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрддреЗ рд╣реИрдВред рдХреЛрдб рдореЗрдВ рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЙрдХреНрдЯреНрд░рд┐рди рдореЗрдВ рдорд╛рдирдЪрд┐рддреНрд░рдг рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреА рд╕рдордЭ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред



рдбреЙрдХреНрдЯреНрд░рд┐рди рдУрдЖрд░рдПрдо рдбреЗрдЯрд╛ рдореИрдкрд░ рдкреИрдЯрд░реНрди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ , рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд░рд┐рд▓реЗрд╢рдирд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреНрд░рдореБрдЦ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ ResultSetMapping рдСрдмреНрдЬреЗрдХреНрдЯ , рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд░рд┐рд▓реЗрд╢рдирд▓ рдореЙрдбрд▓ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдХреИрд╕реЗ рдмрджрд▓рдирд╛ рд╣реИред Doctrine рд╣рдореЗрд╢рд╛ рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ResultSetMapping рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдиреЛрдЯреЗрд╢рди рдпрд╛ yaml, xml рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдбреЗрд╡рд▓рдкрд░ рдХреА рдЖрдБрдЦреЛрдВ рд╕реЗ рдЫрд┐рдкрд╛ рд░рд╣рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рд░ рдХреЛрдИ рдЗрд╕рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред

ResultSetMapping рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ MySQL рдФрд░ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЗ рдирдореВрдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ ред

DB рд╕рдВрд░рдЪрдирд╛


рд╣рдо рд╕рдВрд╕реНрдерд╛рдУрдВ, рдХрд░реНрдордЪрд╛рд░реА, рд╡реЗрддрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдЖрдЧреЗ рднреА рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред

deparment
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Departments
 *
 * @ORM\Table(name="departments", uniqueConstraints={@ORM\UniqueConstraint(name="dept_name", columns={"dept_name"})})
 * @ORM\Entity
 */
class Department
{
    /**
     * @var string
     *
     * @ORM\Column(name="dept_no", type="string", length=4, nullable=false, options={"fixed"=true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $deptNo;

    /**
     * @var string
     *
     * @ORM\Column(name="dept_name", type="string", length=40, nullable=false)
     */
    private $deptName;

    /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="Employee", mappedBy="deptNo")
     */
    private $empNo;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->empNo = new \Doctrine\Common\Collections\ArrayCollection();
    }
}



рдХрд░реНрдордЪрд╛рд░реА

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Employees
*
* ORM\Table(name=┬лemployees┬╗)
* ORM\Entity
*/
class Employee
{
/**
* var int
*
* ORM\Column(name=┬лemp_no┬╗, type=┬лinteger┬╗, nullable=false)
* ORM\Id
* ORM\GeneratedValue(strategy=┬лIDENTITY┬╗)
*/
private $empNo;

/**
* var \DateTime
*
* ORM\Column(name=┬лbirth_date┬╗, type=┬лdate┬╗, nullable=false)
*/
private $birthDate;

/**
* var string
*
* ORM\Column(name=┬лfirst_name┬╗, type=┬лstring┬╗, length=14, nullable=false)
*/
private $firstName;

/**
* var string
*
* ORM\Column(name=┬лlast_name┬╗, type=┬лstring┬╗, length=16, nullable=false)
*/
private $lastName;

/**
* var string
*
* ORM\Column(name=┬лgender┬╗, type=┬лstring┬╗, length=0, nullable=false)
*/
private $gender;

/**
* var \DateTime
*
* ORM\Column(name=┬лhire_date┬╗, type=┬лdate┬╗, nullable=false)
*/
private $hireDate;

/**
* var \Doctrine\Common\Collections\Collection
*
* ORM\ManyToMany(targetEntity=┬лDepartment┬╗, inversedBy=┬лempNo┬╗)
* ORM\JoinTable(name=┬лdept_manager┬╗,
* joinColumns={
* ORM\JoinColumn(name=┬лemp_no┬╗, referencedColumnName=┬лemp_no┬╗)
* },
* inverseJoinColumns={
* ORM\JoinColumn(name=┬лdept_no┬╗, referencedColumnName=┬лdept_no┬╗)
* }
* )
*/
private $deptNo;

/**
* Constructor
*/
public function __construct()
{
$this->deptNo = new \Doctrine\Common\Collections\ArrayCollection();
}

}


рд╡реЗрддрди
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Salaries
*
* ORM\Table(name=┬лsalaries┬╗, indexes={@ORM\Index(name=┬лIDX_E6EEB84BA2F57F47┬╗, columns={┬лemp_no┬╗})})
* ORM\Entity
*/
class Salary
{
/**
* var \DateTime
*
* ORM\Column(name=┬лfrom_date┬╗, type=┬лdate┬╗, nullable=false)
* ORM\Id
* ORM\GeneratedValue(strategy=┬лNONE┬╗)
*/
private $fromDate;

/**
* var int
*
* ORM\Column(name=┬лsalary┬╗, type=┬лinteger┬╗, nullable=false)
*/
private $salary;

/**
* var \DateTime
*
* ORM\Column(name=┬лto_date┬╗, type=┬лdate┬╗, nullable=false)
*/
private $toDate;

/**
* var Employee
*
* ORM\Id
* ORM\OneToOne(targetEntity=┬лEmployee┬╗)
* ORM\JoinColumns({
* ORM\JoinColumn(name=┬лemp_no┬╗, referencedColumnName=┬лemp_no┬╗)
* })
*/
private $empNo;

/**
* var Employee
*
*/
private $employee;

}



рдЗрдХрд╛рдИ рдкрд░рд┐рдгрд╛рдо


рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЖрдзрд╛рд░ рд╕реЗ рд╕рднреА рд╡рд┐рднрд╛рдЧреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рднрд╛рдЧ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ:

        $rsm = new Query\ResultSetMapping();
        $rsm->addEntityResult(Department::class, 'd');
        $rsm->addFieldResult('d', 'dept_no', 'deptNo');
        $rsm->addFieldResult('d', 'dept_name', 'deptName');

        $sql = 'SELECT * FROM departments';

        $query = $this->entityManager->createNativeQuery($sql, $rsm);

        $result = $query->getResult();


AddEntityResult рд╡рд┐рдзрд┐ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдирдореВрдирд╛ рдХрд┐рд╕ рд╡рд░реНрдЧ рдкрд░ рдЕрдиреБрдорд╛рдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ addFieldResult рд╡рд┐рдзрд┐рдпрд╛рдБ рдирдореВрдирд╛ рдХреЙрд▓рдо рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝реАрд▓реНрдб рдХреЗ рдмреАрдЪ рдореИрдкрд┐рдВрдЧ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреА рд╣реИрдВред SQL рдХреНрд╡реЗрд░реА createNativeQuery рд╡рд┐рдзрд┐ рдХреЛ рдЗрд╕ рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдбреЙрдХреНрдЯреНрд░рд┐рди рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ Entity рдХреЗ рдкрд╛рд╕ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ fieldResult рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрдХрд╛рдИ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реБрдП


рд╣рдо рдЙрди рд╡рд┐рднрд╛рдЧреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдЗрди рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ 2000 рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж рдХрд╛рдо рдкрд░ рд░рдЦреЗ рдЧрдП рдХрд░реНрдордЪрд╛рд░реА рд╣реИрдВред

        $rsm = new Query\ResultSetMapping();
        $rsm->addEntityResult(Department::class, 'd');
        $rsm->addFieldResult('d', 'dept_no', 'deptNo');
        $rsm->addFieldResult('d', 'dept_name', 'deptName');

        $rsm->addJoinedEntityResult(Employee::class, 'e', 'd', 'empNo');
        $rsm->addFieldResult('e', 'first_name', 'firstName');
        $rsm->addFieldResult('e', 'last_name', 'lastName');
        $rsm->addFieldResult('e', 'birth_date', 'birthDate');
        $rsm->addFieldResult('e', 'gender', 'gender');
        $rsm->addFieldResult('e', 'hire_date', 'hireDate');

        $sql = "
        SELECT *
            FROM departments d
            JOIN dept_emp ON d.dept_no = dept_emp.dept_no
            JOIN employees e on dept_emp.emp_no = e.emp_no
        WHERE e.hire_date > DATE ('1999-12-31')
       ";

        $query = $this->entityManager->createNativeQuery($sql, $rsm);

        $result = $query->getResult();

ResultSetMappingBuilder


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, ResultSetMapping рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рдирд╛ рдХреБрдЫ рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рдпрд╣ рдЪрдпрди рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдВрдд рд╡рд┐рд╕реНрддреГрдд рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбреЙрдХреНрдЯреНрд░рд┐рди рдПрдХ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - ResultSetMappingBuilder , рдЬреЛ RSM рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИ рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдирд░реЗрдЯрд╕реЗрд▓реЗрдХреНрдЯрд╛рдЙрди рд╡рд┐рдзрд┐ , рдЬреЛ рдЖрдкрдХреЛ рдЪрдпрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдХреНрд╡реЗрд░реА рдХреЗ рдЪрдпрдирд┐рдд рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдкрд┐рдЫрд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рд░рд▓ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

        $sql = "
        SELECT {$rsm->generateSelectClause()}
            FROM departments d
            JOIN dept_emp ON d.dept_no = dept_emp.dept_no
            JOIN employees e on dept_emp.emp_no = e.emp_no
        WHERE e.hire_date > DATE ('1999-12-31')
       ";

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдирд┐рд░реНрдорд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдбреЙрдХреНрдЯреНрд░реАрди рдПрдХ рдЖрдВрд╢рд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рдПрдЧрд╛ , рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдЪрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЦрддрд░рдирд╛рдХ рд╣реИ рдФрд░ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ рд╣реИ ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, ResultSetMappingBuilder рдЖрдкрдХреЛ рдЕрдВрддрд┐рдо рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдиреЛрдЯреЗрд╢рди (рдпрд╛рдореНрд▓, рдПрдХреНрд╕рдПрдордПрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рдо рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдкрд┐рдЫрд▓реЗ рдЕрдиреБрд░реЛрдз рд╕реЗ рдЕрдкрдиреЗ RSM рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

        $rsm = new Query\ResultSetMappingBuilder($this->entityManager);
        $rsm->addRootEntityFromClassMetadata(Department::class, 'd');
        $rsm->addJoinedEntityFromClassMetadata(Employee::class, 'e', 'd', 'empNo');

рд╕реНрдХреЗрд▓рд░ рдкрд░рд┐рдгрд╛рдо


рд╡рд░реНрдгрд┐рдд рдЗрдХрд╛рдИ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбреЙрдХреНрдЯреНрд░рд┐рди рдХреЛ рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдХреЗрд▓рд░ рдкрд░рд┐рдгрд╛рдо рдорд╛рдирдЪрд┐рддреНрд░рдг рдЙрдкрдХрд░рдг, addScalarResult, рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдФрд╕рдд рд╡реЗрддрди рдЪреБрдиреЗрдВ:

        $rsm = new ResultSetMappingBuilder($this->entityManager);

        $rsm->addScalarResult('dept_name', 'department', 'string');
        $rsm->addScalarResult('avg_salary', 'salary', 'integer');

        $sql = "
            SELECT d.dept_name, AVG(s.salary) AS avg_salary
            FROM departments d
            JOIN dept_emp de on d.dept_no = de.dept_no
            JOIN employees e on de.emp_no = e.emp_no
            JOIN salaries s on e.emp_no = s.emp_no
            GROUP BY d.dept_name
        ";

        $query = $this->entityManager->createNativeQuery($sql, $rsm);

        $result = $query->getResult();

AddScalarResult рдкрджреНрдзрддрд┐ рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдореЗрдВ рдХреЙрд▓рдо рдХрд╛ рдирд╛рдо рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд░рдгреА рдХреА рдХреБрдВрдЬреА рд╣реИ рдЬреЛ рдбреЙрдХреНрдЯреНрд░рд┐рди рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред рддреАрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░рд┐рдгрд╛рдо рдорд╛рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред рд░рд┐рдЯрд░реНрди рдорд╛рди рд╣рдореЗрд╢рд╛ рдРрд░реЗ рдХрд╛ рдПрдХ рд╕рд░рдгреА рд╣реЛрдЧрд╛ред

рдбреАрдЯреАрдУ рдореИрдкрд┐рдВрдЧ


рд▓реЗрдХрд┐рди рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛, рдЦрд╛рд╕рдХрд░ рдЬрдм рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдЪрд╛рдмрд┐рдпрд╛рдБ, рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред рд╕рд┐рджреНрдзрд╛рдВрдд DQL рдореЗрдВ рдЪрдпрди рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд╕рд░рд▓ рдбреАрдЯреАрдУ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

    SELECT NEW DepartmentSalary(d.dept_no, avg_salary) FROM тАж

Native Query рдФрд░ RSM рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рд╕рд┐рджреНрдзрд╛рдВрдд рдирдП DTO рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрд┐рдд рдХреНрд╖рдорддрд╛рдПрдВ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди newObjectMappings рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╣рдо рдЪрдпрди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдореИрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрдХрд╛рдИ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ UnitOfWork рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ RSM рд▓рд╛рдЧреВ рдХрд░реЗрдВ:

        $rsm->newObjectMappings['dept_name'] = [
            'className' => DepartmentSalary::class,
            'argIndex' => 0,
            'objIndex' => 0,
        ];

        $rsm->newObjectMappings['avg_salary'] = [
            'className' => DepartmentSalary::class,
            'argIndex' => 1,
            'objIndex' => 0,
        ];

NewObjectMappings рдлрд╝реАрд▓реНрдб рдХреА рд╕рд░рдгреА рдореЗрдВ рдХреБрдВрдЬреА рдкрд░рд┐рдгрд╛рдореА рдХреЙрд▓рдо рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорд╛рди рдПрдХ рдФрд░ рд╕рд░рдгреА рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред ClassName рдХреБрдВрдЬреА рдирдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд░реНрдЧ рдирд╛рдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИ, argIndex - рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рддрд░реНрдХ рдХрд╛ рдХреНрд░рдо , objIndex - рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдХреНрд░рдо, рдпрджрд┐ рд╣рдо рдЪрдпрди рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рд╕реЗ рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдореЗрдЯрд╛ рдкрд░рд┐рдгрд╛рдо


рдореЗрдЯрд╛ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрддрдВрднреЛрдВ рдХрд╛ рдореЗрдЯрд╛-рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА рдпрд╛ рд╡рд┐рднреЗрджрдХ рдХреЙрд▓рдоред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖ рд╕рдХрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рд╡рд┐рд╡рд░рдг рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рддрдХ рдЦреБрдж рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред

        $rsm = new ResultSetMapping;
        $rsm->addEntityResult('User', 'u');
        $rsm->addFieldResult('u', 'id', 'id');
        $rsm->addFieldResult('u', 'name', 'name');
        $rsm->addMetaResult('u', 'address_id', 'address_id');

        $query = $this->_em->createNativeQuery('SELECT id, name, address_id FROM users WHERE name = ?', $rsm);

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, addMetaResult рдкрджреНрдзрддрд┐ рдХреЗ рд╕рд╛рде , рд╣рдо Doctine рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрддреЗ рдкрд░ рдПрдХ рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрд╕реЛрд╕рд┐рдПрд╢рди рдХреЛ рдореЗрдореЛрд░реА (рдЙрддреНрд╕реБрдХ рд▓реЛрдб) рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдПрдХ рдкреНрд░реЙрдХреНрд╕реА-рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЗрдХрд╛рдИ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЙрд╕реЗред

рдХреНрд▓рд╛рд╕рд┐рдХ рд░рд┐рд▓реЗрд╢рдирд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рд╡рд┐рд░рд╛рд╕рдд рддрдВрддреНрд░ рдХреА рдкреЗрд╢рдХрд╢ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рдореЗрдВ рд╡рд┐рд░рд╛рд╕рдд рд╡реНрдпрд╛рдкрдХ рд╣реИред рд╣рдорд╛рд░реЗ рдЪрдпрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдкрд░ рдЕрдиреБрдорд╛рдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЪрдпрди рдореЗрдВ рдХреЙрд▓рдо <discriminator_column> рдХрд╛ рдорд╛рди рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо RSM рдХреЛ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕ рдХреЙрд▓рдо рдореЗрдВ DoDrine рдХреЛ SetDiscriminatorColumn рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреНрд╡рд░рд┐рдд рд╡рд░реНрдЧ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред

рдирд┐рд╖реНрдХрд░реНрд╖


рд╕рд┐рджреНрдзрд╛рдВрдд рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рд╕рдореГрджреНрдз рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╡реЗ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВрдиреЗ рдореВрд▓ рдирд┐рд╡рд╛рд╕реА рдХреНрд╡реЗрд░реА рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ ORM - ResultSetMapping рдХреЗ рдкреНрд░рдореБрдЦ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕рдордЭ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдФрд░ рд╕рдордЭрджрд╛рд░реА рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрдЯрд┐рд▓ рдФрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рдХрд╛рдо рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд░рд┐рдЬрд╝рд▓реНрдЯрд╕реЗрдЯрдореИрдкрд┐рдВрдЧ рдХреЗ рдХрд╛рдо рдХреЛ рд╕рдордЭрдиреЗ рдкрд░ рдЬреЛрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

All Articles