使用ProxyQuery + where子句

时间:2015-07-02 09:32:39

标签: php mysql symfony sonata-admin sonata

我正在使用Sonata Admin bundle,而我在构建查询以显示数据时遇到问题。

我想根据用户的登录信息显示数据 在我的数据库中,我有以下表格:


- 工作表

 - id
 - title
 - description
 - ....
 - company_id (FK)


- 申请表

 - id
 - ...
 - job_id (FK)


- 公司表

 - id
 - ...

我想根据公司提取所有应用程序(登录的用户也附加到公司)。所以我需要一个内部联接与工作表和公司表+ ,其中公司等于....

ApplicationAdmin类中,我现在有:

public function createQuery($context = 'list') {
    $query = parent::createQuery($context);

    $user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();

    if($user->hasRole('ROLE_COMPANY'))
    {
        // I'M STUCK HERE

        $query->setParameter('company', $user->getCompany());
    }

    return $query;
}

有人可以帮助我如何制作2个内连接和where公司的子句吗?

1 个答案:

答案 0 :(得分:1)

我认为您的申请实体与您的工作实体有多对一的关系,而您的工作实体与您的公司实体之间存在多对一的关系,如下所示

公司实体

<?php
use Doctrine\Common\Collections\ArrayCollection;

/** @Entity **/
class Company
{
    // ...
    /**
     * @OneToMany(targetEntity="Job", mappedBy="company")
     **/
    private $jobs;
    // ...

    public function __construct() {
        $this->jobs= new ArrayCollection();
    }
    // getter and setters
}

工作实体

/** @Entity **/
class Job
{

    // ...
    /**
     * @ManyToOne(targetEntity="Company", inversedBy="jobs")
     * @JoinColumn(name="company_id", referencedColumnName="id")
     **/
    private $company;
    // ...

    // ...
    /**
     * @OneToMany(targetEntity="Application", mappedBy="job")
     **/
    private $applications;
    // ...

    public function __construct() {
        $this->applications= new ArrayCollection();
    }
    // getter and setters
}

申请实体

/** @Entity **/
class Application
{
    // ...
    /**
     * @ManyToOne(targetEntity="Job", inversedBy="applications")
     * @JoinColumn(name="job_id", referencedColumnName="id")
     **/
    private $job;
    // ...
    // getter and setters
}

然后在您的ApplicationAdmin班级createQuery函数中,您已在查询对象中拥有Application个实体,您可以将其与第一个Job实体一起加入Company实体1}}实体

public function createQuery($context = 'list') {
    $query = parent::createQuery($context);

    $user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();

    if($user->hasRole('ROLE_COMPANY'))
    {
        $query->innerJoin($query->getRootAlias().'.job','j')
              ->innerJoin('j.company','c')
              ->where('c.id = :company')
              ->setParameter('company', $user->getCompany()->getId());
    }

    return $query;
}