2017-05-07 118 views
0

我有場地管理者的用戶。我希望他們能夠管理他們在這些地方發生的地方和事件。Sonata + Fos_user - 如何僅顯示與用戶相關的實體?

我創建fos_user_user有我建立關係的地方:

<entity name="Application\Sonata\UserBundle\Entity\User" table="fos_user_user"> 
    <id name="id" column="id" type="integer"> 
     <generator strategy="AUTO" /> 
    </id> 
    <many-to-many field="places" target-entity="EchoBundle\Entity\Place"> 
     <join-table name="users_places"> 
      <join-columns> 
       <join-column name="user_id" referenced-column-name="id" /> 
      </join-columns> 
      <inverse-join-columns> 
       <join-column name="place_id" referenced-column-name="id" /> 
      </inverse-join-columns> 
     </join-table> 
    </many-to-many> 
</entity> 

所以,現在,我可以管理用戶,並補充說,他們管理的地方。它工作正常。

問題:

  1. 如何過濾所以一旦登錄,他們只能看到自己的地方呢?

  2. 我該如何讓他們只添加事件到他們自己的地方?目前,當您添加活動時,您可以從中選擇完整的地點列表。

  3. 如何篩選所有事件,以便他們只能看到與他們管理的地點相關的事件?

我在Sonata文檔中查看了「自定義查詢用於生成列表」,但不知道如何使用它。我試圖添加4年前在StackOverflow中找到答案的安全查詢,但它不起作用。

回答

0

在管理員類可以覆蓋createQuery(你應該檢查並修復下面的例子,以滿足您的應用程序模型);) 該解決方案將覆蓋問題1和3

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

    $aliases = $query->getRootAliases(); 
    $query 
     ->leftJoin($aliases[0] . '.users_places', 'users_places') 
     ->andWhere($query->expr()->eq('users_places.user_id', ':user')) 
     ->setParameter('user', $this->getConfigurationPool()->getContainer()->get('security.token_storage')->getToken()->getUser()); 

    return $query; 
} 

問題2: 如果您正在使用奏鳴曲formMapperconfigureFormFields方法,您可以在字段定義中傳遞自定義查詢生成器。

$formMapper 
    ->add('events', 'sonata_type_model', [ 
     'label' => 'Events', 
     'placeholder' => 'Select ...', 
     'required' => true, 
     'query' => $blQueryBuilder, 
    ]); 
+0

謝謝。我快到了。 關於第二個,我有類似於添加事件形式的東西: - > add('place','sonata_type_model',array( 'class'=>'EchoBundle:Place', 'property'=> 'name', 'label'=>'Place', 'query'=> $ placeQuery, ))' 但是我有一個問題來構建查詢只包含屬於用戶的列表位置。在「原始」SQL中,它將是: SELECT DISTINCT p.name FROM users_places u LEFT JOIN places p ON u.places_id = p.id ... –

+0

關於第一個 - 我添加它但收到: 試圖調用未定義的類「Doctrine \ ORM \ Query \ Expr \ Comparison」中名爲「andWhere」的方法。 –

+0

嗨, 對不起,我在回答中犯了一個錯誤。 查詢expr生成器'$ query-> expr() - > eq'應該從select到andwhere子句中移動。 – WebHQ

相關問題