나는 두 개의 링크 된 엔티티 인 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
실제로이 문서를 읽으면 extralazy association이 필요합니다. 로드를 트리거하지 않고 Collection의 isEmpty 메서드에 액세스 할 수 있다면 여전히 좋을 것입니다. 사용 가능한지 알고 있습니까? –
실제로 추가 게으른 모음에 대한 호출 횟수가 전체 모음을로드하지 않습니다. 여분의 게으른 콜렉션에 대한 문서에서는 이것을 설명합니다. – Ota
나는 읽었다. 그러나 큰 결과 세트로 작업 할 때 카운트조차도 사실 일 수 있습니다. 그래서 isEmpty를 대신 사용하려고 생각했습니다. 하지만 시험 중이 야. 결과와 함께 2 분 안에 BRB. –