Domanda

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

È stato utile?

Soluzione

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top