Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Doctrine2-双左连接查询问题_Php_Symfony_Doctrine Orm_Doctrine_Symfony 3.4 - Fatal编程技术网

Php Doctrine2-双左连接查询问题

Php Doctrine2-双左连接查询问题,php,symfony,doctrine-orm,doctrine,symfony-3.4,Php,Symfony,Doctrine Orm,Doctrine,Symfony 3.4,我正在使用symfonyv3.4分支和原则 我在将SQL查询转换为ORM查询时遇到问题 我有三张桌子 商店 坚定的 使用者 用户-->1:1-->公司-->1:1-->车间 (Symfony developer工具栏报告表中的关联是否正确) 我想在一次查询中获得与cretainUser对应的Shop数据 我的SQL,得到一个结果: SELECT * FROM mp2_fos_user as u LEFT JOIN mp2_firm AS f ON u.id = f.firmUserId LE

我正在使用
symfonyv3.4分支
原则

我在将SQL查询转换为ORM查询时遇到问题

我有三张桌子

  • 商店
  • 坚定的
  • 使用者
用户-->1:1-->公司-->1:1-->车间

(Symfony developer工具栏报告表中的关联是否正确)

我想在一次查询中获得与cretain
User
对应的
Shop
数据

我的SQL,得到一个结果:

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]第0行第57列:错误:应为字符串结尾,得到“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();

Get
[语法错误]第0行,第54列:错误:预期字符串结尾,Get'f'

我想了一些与此类似的东西(假设实体名称正确):


如果您在实体中定义了映射,则无需使用
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
{
    //.....
}
然后您可以简单地使用属性来连接您的实体

$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();

如果
mp2\u公司
实体通过属性
firmUser
mp2\u fos\u用户
实体存在关系,则尝试with语句,如
with f.firmUser=u
。与
firmShop
@geoB的想法相同谢谢您的建议。不幸的是,这个问题依然存在。我更新了问题以反映这一点。虽然错误略有改变…感谢您的想法,但您的示例会导致错误。
$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();