0

スーパークラスLibraryCommonと 4 つのサブタイプがあります: LibraryPurchasedLibraryPurchasableLibraryおよびPersonalLibrary

LibraryLibraryCommon追加フィールドのない単純な拡張でPurchasedLibraryあり、ユーザー エンティティがあります。ある例では、特定のユーザーに属するLibrariesすべてのものが必要です。PurchasedLibraries

だから私はでメソッドを作成しましたLibraryCommonRepository

public function findLibraries($user)
{
    return $this->createQueryBuilder('l')
        ->where('l INSTANCE OF Library')
        ->orWhere('l INSTANCE OF PurchasedLibrary AND l.user = :user')
        ->setParameter(':user', $user)
        ->getQuery()
        ->getResult()
    ;
}

ただし、これはエラーになり[Semantical Error] line 0, col 182 near 'user = :user': Error: Class LibraryCommon has no field or association named userます。

何か不足していますか、それとも、必要な結果を得るために 2 つの個別のクエリを結合する必要がありますか?


さらに、ユーザーを提供せずに次のようにした場合:

public function findLibraries()
{
    return $this->createQueryBuilder('l')
        ->where('l INSTANCE OF Library OR l INSTANCE OF PurchasedLibrary')
        ->getQuery()
        ->getResult()
    ;
}

生成されたクエリは次のようになります。

SELECT 
...
FROM 
  library l0_ 
WHERE 
  (
    l0_.type IN ('library') 
    OR l0_.type IN ('purchased')
  ) 
  AND l0_.type IN (
    'library', 'personal', 'purchased', 
    'purchasable'
  )

クエリを実行させる方法はありますかWHERE l0_.type IN ('library', 'purchased')

4

1 に答える 1

1

User マッピングを LibraryCommon に追加し、private 属性のみを追加し、デフォルトを null にして、PurchedLibrary に getter と setter を保持することをお勧めします。

于 2013-06-20T10:14:47.093 に答える