0

トリッキーなクエリの問題があります。このコードを使用して、ユーザーがアクセスできるコンテナーを抽出します (多対多の関係で定義されたアクセス)。

    //Fetch the containers
    $repository = $this->getDoctrine()->getRepository('BizTVContainerManagementBundle:Container');
    $query = $repository->createQueryBuilder('c')
        ->innerJoin('c.users','u')
        ->where('c.company = :company')
        ->setParameter('company', $companyId)
        ->orderBy('c.name', 'ASC')
        ->getQuery();
    $containers = $query->getResult();

これで、実際には、会社、地域、建物、画面の 4 レベルのアクセス許可の階層ができました。ユーザーが親オブジェクトに対する権限を持っている場合、子オブジェクトに特定の権限が設定されていなくても、クエリが子オブジェクトも返すように設定したいと思います。

symfony2 の優れたエンティティ システムにアクセスできるとしたら、次のようなものを配置できます。

If $entity->getParent() == granted
OR
$entity->getParent()->getParent() == granted
THEN
this is granted also

しかし、SQL では、このようなレベルで掘り下げることはできませんね。

4

1 に答える 1

0

クエリで完全な階層を取得できます。

$query = $repository->createQueryBuilder('company')
    ->leftJoin('company.parent','geoarea')
    ->leftJoin('geoarea.parent','building')
    ->leftJoin('building.parent','screen')

アクセス許可をどのように保存しているかは明確ではありませんが、クエリ内で条件を「or」して、階層内の各項目をチェックできます。

于 2012-08-19T13:01:46.793 に答える