0

Sonata Admin バンドルを使用していますが、データを表示するクエリの作成に問題があります。

ログインしているユーザーに応じてデータを表示したいと思います。
データベースには次のテーブルがあります。


- ジョブテーブル

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


- アプリケーション表

 - id
 - ...
 - job_id (FK)


- 会社のテーブル

 - id
 - ...

会社に依存するすべてのアプリケーションをプルしたい (ログインしているユーザーも会社に関連付けられている)。したがって、job テーブルと company テーブル + company... と等しい内部結合が必要になります。

私の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句を作成する方法を教えてもらえますか?

4

1 に答える 1

1

Application エンティティは Job エンティティと多対 1 の関係にあり、 Job エンティティは Company エンティティと多対 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と結合できますJobCompany

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;
}
于 2015-07-03T20:03:38.087 に答える