【发布时间】:2016-09-06 14:42:11
【问题描述】:
我在执行这个 SQL 请求时遇到了麻烦:
SELECT *
FROM project
LEFT JOIN user
ON project.idAuthor=user.id
WHERE project.isVisible = 1 AND
user.role = 'agency'
到一个简单的 Symfony 查询构建器:
$query = $this->createQueryBuilder('p')
->leftJoin('WebAwardsBundle:User', 'u')
->where('p.isVisible = 1')
->andwhere("u.role = 'agency'")
->orderBy('p.id', 'DESC')
->getQuery();
这个查询的响应给了我所有的项目,包括项目当角色!==机构...
我不知道我可以把ON project.idAuthor=user.id放在哪里
映射:
项目:
/**
* Project
*
* @ORM\Table(name="project")
*@ORM\Entity(repositoryClass="WebAwardsBundle\Repostory\ProjectRepository")
*/
class Project
{
...
/**
* @var int
*
* @ORM\ManyToOne(targetEntity="User", inversedBy="projects")
* @ORM\JoinColumn(name="idAuthor", referencedColumnName="id")
*/
private $idAuthor;
...
用户:
/**
* User
*
* @ORM\Table(name="user")
* @ORM\Entity(repositoryClass="WebAwardsBundle\Repository\UserRepository")
*/
class User implements UserInterface, \Serializable{
...
/**
* @ORM\OneToMany(targetEntity="Project", mappedBy="idAuthor")
*/
private $projects;
...
【问题讨论】:
-
这是一个左连接,所以是的,它仍然会带回来自
p的所有行。至于ON部分,您已经在实体(或其他记录在案的地方)中定义了关系,因此您无需显式提供它。 -
你看过文档吗?提示:对于学说查询构建器,您不需要 ON 子句。查询构建器已经知道您的关系是如何映射的。
-
如果你不想拥有 user.role !== 代理的项目,那么你应该使用
innerJoin。 -
@EmanuelOster :对不起,
innerJoin不只给我代理:/ -
@Cerad : 嗯,我看到了这个,但我认为我的映射已经准备好了......我会发布那个。
标签: php mysql left-join symfony