dousongqiang2585 2014-05-15 21:19
浏览 40
已采纳

doctrin2 zf2本机sql连接表

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

  • 写回答

1条回答 默认 最新

  • dougang5088 2014-05-16 20:05
    关注

    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.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥120 计算机网络的新校区组网设计
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单