2014-07-18 2 views
0

나는 두 개의 링크 된 엔티티 인 User와 Acess를 가지고 있습니다. 내 교리 사용자 엔티티에 사용자에게 액세스 권한이 있는지 여부를 알려주는 필드가 있어야합니다. 두 테이블간에 간단한 OneToMany 관계를 수행 할 수 없습니다. 수천 개의 acesses가 있고 데이터베이스가 있는지 여부를 알기 만하면 데이터베이스에서 수천 개의 레코드를 가져 오는 데 너무 많은 비용이 들기 때문입니다. 더 구체적으로Doctrine - 쿼리를 기반으로하는 사용자 정의 양식 필드

select * from accesses where user = <whatever> limit 1 

, 같은 :

/** 
* USer 
* 
* @ORM\Table(name="user") 
* @ORM\Entity 
*/ 
class User { 

    /** 
    * @ORM\Column(name="user_id", type="bigint", nullable=false) 
    * @ORM\Id 
    */ 
    private $id; 

    /** 
    * @ORM\Column(name="name", type="string", length=300, nullable=false) 
    * @Assert\NotBlank() 
    */ 
    private $name; 

    /** 
    * @ORM\Query="select exists (select id_acesses from accesses where user = "$id" limit 1)" 
    */ 
    private $hasAcesses; 
} 

이 가능 같은 기본 쿼리에 연결된 필드 내가 원하는 것입니까? 이것을 할 또 다른 방법이 있습니까?

편집 : 아래 @Otanaught 답변에 따라

, 내가했던 몇 가지 검사 :

EXTRA_LAZY와 OneToMany 관계를 사용하여 페치 :

사용자 getAccesses() -> IsEmpty 함수를 () 전체 컬렉션을 선택

반환하려면 243ms가 걸린 데이터베이스에서 count-count (*) 사용 횟수 (*)

comparingly 내 쿼리 위의 누가 원하는지 2ms 또는 1ms의 peek으로 평균 12ms 걸렸습니다.

아마도 doctrine의 좋은 사람들은 추가 게으른 쿼리를 위해 isEmpty에서이를 구현할 수 있습니까?

고맙습니다 @Otanaught

답변

1

교리는 엔티티 (Annotation reference)의 속성에 대한 쿼리를 지정할 수 있습니다 주석을 제공하지 않습니다. 수표를 구현하기 위해 custom method in your repository을 만들 수 있습니다. 당신은 그 관계가 얼마나 비싼지를 측정 했습니까? 교리가 게으른 관계를로드하기 때문에 올바른 관계와 색인으로 이것은 아무런 문제가되지 않을 것입니다. Check the doctrine documentation about extra lazy collections.

+0

실제로이 문서를 읽으면 extralazy association이 필요합니다. 로드를 트리거하지 않고 Collection의 isEmpty 메서드에 액세스 할 수 있다면 여전히 좋을 것입니다. 사용 가능한지 알고 있습니까? –

+0

실제로 추가 게으른 모음에 대한 호출 횟수가 전체 모음을로드하지 않습니다. 여분의 게으른 콜렉션에 대한 문서에서는 이것을 설명합니다. – Ota

+0

나는 읽었다. 그러나 큰 결과 세트로 작업 할 때 카운트조차도 사실 일 수 있습니다. 그래서 isEmpty를 대신 사용하려고 생각했습니다. 하지만 시험 중이 야. 결과와 함께 2 분 안에 BRB. –

관련 문제