Php Symfony 4,多单实体关系,get';父母';仅当至少有一个子项包含特定值时,错误";字符串的预期结尾,get';在'&引用;
从Symfony 4中,我在实体a和B之间有一个多个关系(多个B只代表一个a)。仅当“子”B的Specific字段中的值为1时,我希望选择所有id的A行 “A”表: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
---
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;:)