2015-07-02 3 views
0

Я использую Sonata Admin bundle, и у меня возникают проблемы с формированием запроса для отображения данных.Внутреннее соединение с ProxyQuery + где статья

Я хотел бы показать в зависимости данных о пользователе, который вошел в
В моей базе данных у меня есть следующие таблицы:.


- Работа таблица

- 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 внутренних соединений и где положение с компанией?

ответ

0

Я предполагаю, что ваша организация Приложение имеет отношение многие-к-одному для вашей организации работы и ваша работа организация имеет отношение многие-к-одному с вашей сущности компании что-то вроде ниже

компании Entity

<?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

/** @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

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

Тогда в createQuery функции вашего ApplicationAdmin класса у вас уже есть Application объекта в объекте запроса вы можете присоединиться к нему с первым Job лица затем Company лицами

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; 
} 
Смежные вопросы