I use this code to execute native sql query in zf2 application with doctrine2.
I use this code
$rsm = new ResultSetMapping();
$rsm->addEntityResult('Admin\Entity\SkillsExperience', 'skexp');
$rsm->addFieldResult('skexp', 'id', 'id');
$rsm->addFieldResult('skexp', 'idExperience', 'id_experience');
$rsm->addFieldResult('skexp', 'idSkillsDetails', 'id_skills_details');
$rsm->addJoinedEntityResult('Admin\Entity\SkillsDetails', 'skd','skexp','idSkillsDetails');
$rsm->addFieldResult('skd','description','description');
$rsm->addFieldResult('skd','idSkill','id_skill');
$sql = "
SELECT
skexp.id,
skexp.id_experience,
skexp.id_skills_details,
skd.description,
skd.id_skill
FROM skills_experience skexp
INNER JOIN skills_details skd
ON skd.id = skexp.id_skills_details
WHERE skexp.id_experience = $id_experience
ORDER BY skd.id_skill
";
$query = $this->getEntityManager()
->createNativeQuery($sql, $rsm)
->setParameter(1,$id_experience);
echo $query->getSQL();
$skexp = $query->getResult();
var_dump($skexp);
this is result
array(1) { [0]=> object(Admin\Entity\SkillsExperience)#471 (3) { ["id":"Admin\Entity\SkillsExperience":private]=> string(1) "1" ["idExperience":"Admin\Entity\SkillsExperience":private]=> NULL ["idSkillsDetails":"Admin\Entity\SkillsExperience":private]=> object(Admin\Entity\SkillsDetails)#473 (3) { ["id":"Admin\Entity\SkillsDetails":private]=> NULL ["description":"Admin\Entity\SkillsDetails":private]=> string(18) "skillsname" ["idSkill":"Admin\Entity\SkillsDetails":private]=> NULL } } }
I expect 'Admin\Entity\SkillsDetails' in idSkillsDetails, but it is not
I can't obtain
skd.description, skd.id_skill
how can I?
thanks
Ok i solved
$rsm = new ResultSetMapping;
$rsm->addEntityResult('Admin\Entity\SkillsExperience', 'ske');
$rsm->addFieldResult('ske', 'id', 'id');
$rsm->addFieldResult('ske', 'idExperience', 'id_experience');
$rsm->addJoinedEntityResult('Admin\Entity\SkillsDetails' , 'skd', 'ske', 'idSkillsDetails');
$rsm->addFieldResult('skd', 'idx', 'id');
$rsm->addFieldResult('skd', 'description', 'description');
$rsm->addJoinedEntityResult('Admin\Entity\Skills' , 'sk', 'skd', 'idSkill');
$rsm->addFieldResult('sk','idx2','id');
$sql = <<<EOT
SELECT
ske.id,
ske.id_experience,
skd.id as idx,
skd.description,
skd.id_skill,
sk.id as idx2
FROM skills_experience ske
LEFT JOIN skills_details skd
ON skd.id = ske.id_skills_details
LEFT JOIN skills sk
ON sk.id = skd.id_skill
WHERE id_experience = ?
ORDER BY sk.id
EOT;
$query = $this->em->createNativeQuery($sql,$rsm);
$query->setParameter(1,$id_experience);
$array = $query->getResult();
First of all it should be noted that when there are fields that have the same name in different tables, you must assign aliases.
When you add a join to the native query, you must use the following method
addJoinedEntityResult
There are 4 parameters
1) The class / entity on which the join is performed
2) The alias of the table on which the join is used in the query
3) The alias of the parent table used in the query
4) The field of the parent entity connected to the daughter (in my case idSkillsDetails to join the first and the second idSkill to join)
You must not, in the method for classes addFieldResult fathers, the field used to make the join
I hope it will be useful to others.