【问题标题】:createQueryBuilder / Join Column - SymfonycreateQueryBuilder / 加入列 - Symfony
【发布时间】: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


【解决方案1】:

实现这个 SQL 请求的正确答案:

SELECT *
FROM project
LEFT JOIN user 
ON project.idAuthor=user.id 
WHERE project.isVisible = 1 AND
user.role = 'agency'

是加入实体的正确列(在这种情况下为用户的project.idAuthor):

$query = $this->createQueryBuilder('p')
        ->join('p.idAuthor', 'u')
        ->where('p.isVisible = 1')
        ->andWhere("u.role = 'agency'")
        ->orderBy('p.id', 'DESC')
        ->getQuery();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多