Doctrine2 - 双左连接查询问题

时间:2018-06-09 18:00:32

标签: php symfony doctrine-orm doctrine symfony-3.4

我将<?php $pageNo = "1"; $jsonString = file_get_contents("http://api.domain.com/apikey/? name1=value1&name2=value2&pageNo=$pageNo"); $jsonDecoded = json_decode($jsonString, true); $csvHeader=array(); $csvData=array(); $csvFileName = 'output.txt'; $fp = fopen($csvFileName, 'w'); $counter=0; foreach($jsonDecoded["result"]["items"] as $key => $value) { jsontocsv($value); if($counter==0) { fputcsv($fp, $csvHeader, ';'); $counter++; } fputcsv($fp, $csvData, ';'); $csvData=array(); } fclose($fp); function jsontocsv($data) { global $csvData,$csvHeader; foreach($data as $key => $value) { if(!is_array($value)) { $csvData[]=$value; $csvHeader[]=$key; } else { jsontocsv($value); } } } ?> Symfony v3.4 branch一起使用。

我无法将SQL查询转换为Doctrine ORM查询。

我有3张桌子。

  • 商店
  • 事务所
  • 用户

用户 - &gt; 1:1 - &gt;坚定 - &gt; 1:1 - &gt;店

(Symfony开发人员工具栏报告表中的关联正确)。

我想在一个查询中获得与cretain Doctrine对应的Shop数据。

我的SQL,得到一个结果:

User

我的学说ORM查询

SELECT *
FROM mp2_fos_user as u
LEFT JOIN mp2_firm AS f ON u.id = f.firmUserId
LEFT JOIN mp2_shop AS s ON f.id = s.shopFirmId
WHERE u.id = 1

目前运行代码会导致错误

$query = $em->createQueryBuilder() ->select('u, f, s') ->from('App:User', 'u') ->leftJoin('u.userFirm WITH u.id = f.firmUserId', 'f') ->leftJoin('f.firmShop WITH f.id = s.shopFirmId', 's') ->where('u.id = :user_id') ->setParameter('user_id', $user_id) ->getQuery();

我的问题最佳做法是什么?

非常感谢帮助, 谢谢!

更新

尝试:

[Syntax Error] line 0, col 57: Error: Expected end of string, got 'u'

得到$query = $em->createQueryBuilder() ->select('s.id') ->from('App:User', 'u') ->leftJoin('u.userFirm WITH f.firmUser = u', 'f') ->leftJoin('f.firmShop WITH s.shopFirm = f', 's') ->where('u.id = :user_id') ->setParameter('user_id', $user_id) ->getQuery();

2 个答案:

答案 0 :(得分:2)

如果您在实体中定义了映射,则无需使用WITH子句,当您想要使用其他匹配条件加入实体时,使用WITH子句

class User
{
    /**
     * @ORM\YourRelationShipNature(targetEntity="App\Entity\Firm", mappedBy="user")
     */
    private $userFirm;
}

class Firm
{
    /**
     * @ORM\YourRelationShipNature(targetEntity="App\Entity\Shop", mappedBy="firm")
     */
    private $firmShop;
}


class Shop
{
    //.....
}

然后你可以简单地使用属性加入你的entites

$query = $em->createQueryBuilder()
    ->select('u, f, s')
    ->from('App:User', 'u')
    ->leftJoin('u.userFirm', 'f')
    ->leftJoin('f.firmShop', 's')
    ->where('u.id = :user_id')
    ->setParameter('user_id', $user_id)
    ->getQuery();

答案 1 :(得分:0)

我正在考虑更多这方面的事情(假设实体名称是正确的):

$query = $em->createQueryBuilder()
    ->select('u, f, s')
    ->from('App:User', 'u')
    ->leftJoin('App:UserFirm f WITH f.firmUser = u')
    ->leftJoin('App:FirmShop s WITH s.shopFirm = f')
    ->where('u.id = :user_id')
    ->setParameter('user_id', $user_id)
    ->getQuery();