Php Symfony 4,多单实体关系,get';父母';仅当至少有一个子项包含特定值时,错误";字符串的预期结尾,get';在'&引用;

Php Symfony 4,多单实体关系,get';父母';仅当至少有一个子项包含特定值时,错误";字符串的预期结尾,get';在'&引用;,php,symfony,doctrine-orm,doctrine,symfony4,Php,Symfony,Doctrine Orm,Doctrine,Symfony4,从Symfony 4中,我在实体a和B之间有一个多个关系(多个B只代表一个a)。仅当“子”B的Specific字段中的值为1时,我希望选择所有id的A行 “A”表: --- id --- 0 1 2 表'B': ---------------------------------- id parent_id specificfield ---------------------------------- 0 1 1 1 1

从Symfony 4中,我在实体a和B之间有一个多个关系(多个B只代表一个a)。仅当“子”B的Specific字段中的值为1时,我希望选择所有id的A行

“A”表:

---
id 
---
0
1
2
表'B':

----------------------------------
id    parent_id    specificfield 
----------------------------------
0     1            1
1     1            0
2     2            0
预期结果:

---
id 
---
1 
// because, only the A row with the id 1 have at least one 'child' in the table B with the specificfield set to 1 
我尝试构建如下查询:

$res = $this->em->createQueryBuilder()
    ->select('A.id')
    ->from(Parent::class,'A')
    ->innerJoin(Child::class,'B',Join::ON,"A.id = B.parent_id")
    ->where('B.specificfield = 1')
    ->distinct()
    ->getQuery()
    ->getResult();
但是我得到了一个错误:“应该是字符串的结尾,得到了‘ON’”

sql查询等价物在我的phpmyadmin中工作

SELECT DISTINCT A.id
FROM parent A
INNER JOIN child B ON A.id = B.parent_id
WHERE e.specificfield = 1

我看不出我在dql查询中的错误在哪里。

我认为您需要在连接中使用“with”而不是“on”…

我认为在使用ORM时,您需要在连接中使用“with”而不是“on”…

直接处理实体而不是表。这需要你有一点不同的想法,尤其是在关于混乱的问题上。您正在连接实体的属性,而不是表/对象之间的属性

因此,查询如下所示:

$builder
    ->select('a.id')
    ->from(A::class, 'a')
    ->innerJoin('a.children', 'b')
    ->where('b.active = 1')
    ->getQuery()
    ->getResult();
因此,您只需指定要加入的属性,因为映射已经指定了属于该属性的实体,所以它应该工作。作为参考,这是我的实体的外观:

/**
 * @ORM\Entity()
 */
class A
{
    /**
     * @ORM\Id()
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\B", mappedBy="parent")
     */
    private $children;

    ...
}
/**
 * @ORM\Entity()
 */
class B
{
    /**
     * @ORM\Id()
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\A", inversedBy="children")
     * @ORM\JoinColumn(nullable=false)
     */
    private $parent;

    /**
     * @ORM\Column(type="boolean", options={"default": false})
     */
    private $active;

    ...
}

编辑以澄清:当您加入
B::class
而不是
a.children
时。然后,您只需告诉查询生成器,您希望以不相关的方式一次获取多个实体。如果您想通过一个查询快速收集所有As和活动Bs,但在使用ORM时,您还必须选择b.id.

您直接处理的是实体而不是表。这需要你有一点不同的想法,尤其是在关于混乱的问题上。您正在连接实体的属性,而不是表/对象之间的属性

因此,查询如下所示:

$builder
    ->select('a.id')
    ->from(A::class, 'a')
    ->innerJoin('a.children', 'b')
    ->where('b.active = 1')
    ->getQuery()
    ->getResult();
因此,您只需指定要加入的属性,因为映射已经指定了属于该属性的实体,所以它应该工作。作为参考,这是我的实体的外观:

/**
 * @ORM\Entity()
 */
class A
{
    /**
     * @ORM\Id()
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\B", mappedBy="parent")
     */
    private $children;

    ...
}
/**
 * @ORM\Entity()
 */
class B
{
    /**
     * @ORM\Id()
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\A", inversedBy="children")
     * @ORM\JoinColumn(nullable=false)
     */
    private $parent;

    /**
     * @ORM\Column(type="boolean", options={"default": false})
     */
    private $active;

    ...
}

编辑以澄清:当您加入
B::class
而不是
a.children
时。然后,您只需告诉查询生成器,您希望以不相关的方式一次获取多个实体。如果您想通过一个查询快速收集所有As和活动Bs,但还必须选择b.id.

在哪里使用查询生成器导入
使用条令\ORM\query\Expr\Join?是的,我使用了条令\ORM\Query\Expr\Join;:)在使用查询生成器的位置导入
使用条令\ORM\query\Expr\Join?是的,我使用了条令\ORM\Query\Expr\Join;:)