2016-07-07 7 views
-1

から関連するエンティティを取得する方法を、私は、任意のGroupオブジェクトから取得する関連Permissionたいと思います。ここでベストプラクティス:1つのエンティティ2つのエンティティ<code>Permission</code>と<code>Group</code>とその関連エンティティ<code>GroupPermission</code>考える

が私のエンティティの(簡体字)の説明である:(Permissionを記述し、GroupGroupPermissionオブジェクト)私の3つの文書クラスに加えて

---------- 
Permission 
---------- 
permissionId 
name 

----- 
Group 
----- 
groupId 
name 

---------------- 
GroupPermission 
---------------- 
groupPermissionId 
groupId 
permissionId 

、私は、関連するすべてのデータベースを含む3つのリポジトリのクラスを(持っています論理)。

理想的には、私は$anyGroup->getPermissions()を行うことができるようにしたいと思い、直接すべてのPermissionオブジェクトを取得します。

エンティティはそのリポジトリ(および他のエンティティリポジトリ)を知らないため、このような動作を実装するのがベストプラクティスであるかどうかはわかりません。

EDIT: @KhorneHoly答えに続き、私はいくつかの制約を追加します。

マイドキュメントクラスは、JSONに簡単に直列化可能にするためにJsonSerializableクラスを実装します。 は、したがって、私はそれを行う方法を説明する以下の方法があります。

public function jsonSerialize() 
{ 
    return array(
     'groupId' => $this->getGroupId(), 
     'name' => $this->getName(), 
    ); 
} 

を私はJSONでそれらを含めるために、そこからの権限にアクセスしたいと思います。

public function jsonSerialize() 
{ 
    return array(
     'groupId' => $this->getGroupId(), 
     'name' => $this->getName(), 
     'permissions' => $this->getPermissions() 
    ); 
} 

答えて

0

あなただけの標準リポジトリ機能でそれらを取得することができます。

$em = $this->getDoctrine()->getManager(); 
$em->getRepository('permissions')->findBy(array('groupId' => $anyGroup->getId())); 

あなたはArrayCollectionへのアクセス権を保存している場合は、別の方法があるだろう。

$anyGroup->getPermissions(); 

しかし、これを行うには、関係を追加するときにアクセス許可をArrayCollectionに追加する必要があります。

しかし、リレーションシップを追加するときにエンティティをフラッシュしないようにする方法はないので、私は常にリポジトリの方法を好みます。

+0

私はこの方法を知っていましたが、ドキュメントクラスで直接同じ動作を使用する必要があります。私はそれに従って私の質問を編集しました。 –

+0

@fef私はあなたの問題を見ることができません。あなたのコントローラの中で 'json_serialize'関数を使用している場合は、リポジトリからパーミッションを取得して配列に追加するだけです。 – KhorneHoly

+0

このメソッドは非常に頻繁に使用されるので、手動で追加する必要はありません。 特に、 'return new JsonResponse(array( 'groups' => $ arrayContainingMultipleGroups))のようなものを実行すると、 –

関連する問題