0

symfony2의 "클래스 테이블 상속"모델을 사용하여 상속을받는 데이터베이스 모델을 사용하고 있습니다.symfony2로 Inheritance 자식 엔티티를 UserInterface로 설정하는 방법

Employee는 추상 클래스 인 최상위 상속 모델입니다.

비서는 직원을 연장하는 자녀입니다. 기술자는 또한 직원을 연장하는 자녀입니다.

나는 비서 기술자에 대한 몇 가지를 관리 할 수있는 응용 프로그램을 구축하고, 그래서 그들은 등 어떤 형태

SecretaryRepository는 비서가 응용 프로그램을 통해 인증 할 수 있도록 UserProvider의 인터페이스와 관리자 패널이있다.

내가 가진 문제는

SELECT e0_.*, s1_.* 
FROM secretaries s1_ 
INNER JOIN employees e0_ ON s1_.id = e0_.id 
WHERE e0_.removed_at IS NULL AND e0_.is_hidden = ? AND e0_.email = ? 

난 그냥 이해가 안 돼요 인증 쿼리 ... 판별에 대해

인증 SQL 쿼리의 디버그를 상관하지 않는다는 것입니다 장관과 직원의 관계를 관리하고 있습니까? 비서가 직원에게 외래 키를 수동으로 포함시켜야합니까? 또는 수동으로 인증 쿼리의 discriminator 처리해야합니까?

부모 급 직원

abstract class Employee 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="email", type="string", length=255, nullable=true) 
    */ 
    protected $email; 

    // [...] some other fields 
} 

아이 클래스 장관

class Secretary extends Employee 
{ 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="password", type="string", length=255, nullable=true) 
    * @Assert\NotBlank() 
    */ 
    private $password; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="salt", type="string", length=40) 
    */ 
    private $salt; 

    /** 
    * @var array 
    * 
    * @ORM\Column(name="roles", type="array") 
    */ 
    private $roles; 

    // [...] some other fields 
} 

UserProviderInterface 클래스 :

의 내 모델의 기초를 살펴 보자 비서 그것은, 직원하지만 직접 아이디 insteed에 비서에서 외래 키를 사용하지 않는 그 기술자 ID를 너무 수 있기 때문에

class SecretaryRepository extends EntityRepository implements UserProviderInterface 
{ 
    public function loadUserByUsername($username) 
    { 
     $secretary = null; 

     $qb = $this->_em->createQueryBuilder(); 

     $qb->select('s') 
      ->from('HygieCoreBundle:Secretary', 's') 
      ->where($qb->expr()->isNull('s.removedAt')) 
      ->andWhere($qb->expr()->eq('s.isHidden', ':isHidden')) 
      ->andWhere($qb->expr()->eq('s.email', ':email')) 
      ->setParameter('isHidden', false) 
      ->setParameter('email', $username) 
     ; 

     try { 
      $secretary = $qb->getQuery()->getSingleResult(); 
     } 
     catch (NoResultException $e) { 
      throw new UsernameNotFoundException(sprintf('Aucune secrétaire ne possède l\'adresse e-mail : "%s".', $username), 0, $e); 
     } 

     return $secretary; 
    } 

    // [...] some other methods 
} 

저장소

문제는 간단하다, 내부 JOIN 절을 올바르지 않습니다! 여기

내 테이블의 일부 행의 수출이다 :

INSERT INTO `technicians` (`id`, `speciality`) VALUES 
(1, 'Communication') 

INSERT INTO `employees` (`id`, `created_at`, `updated_at`, `removed_at`, `is_hidden`, `firstname`, `name`, `entityName`) VALUES 
(1, '**sometime**', '**sometime**', NULL, 0, '**TechnicianFirstname**', '**TechnicianName**', 'technician'), 
(2, '**sometime**', '**sometime**', NULL, 0, '**SecretaryFirstName**', '**SecretaryName**', 'secretary'); 

INSERT INTO `secretaries` (`id`, `password`, `salt`, `roles`) VALUES 
(1, '**HashedPassword**', '**HashedSalt**', 'O:43:"Doctrine\\Common\\Collections\\ArrayCollection":1:{s:54:"\0Doctrine\\Common\\Collections\\ArrayCollection\0_elements";a:1:{i:0;s:10:"ROLE_ADMIN";}}'); 

ALTER TABLE `technicians` ADD CONSTRAINT `FK_1DCF6554BF396750` FOREIGN KEY (`id`) REFERENCES `employees` (`id`) ON DELETE CASCADE; 

ALTER TABLE `secretaries` ADD CONSTRAINT `FK_ACB3412BF396750` FOREIGN KEY (`id`) REFERENCES `employees` (`id`) ON DELETE CASCADE; 

답변

1

당신은 secretaries 테이블에서 직접 데이터를 선택하고, 그래서 당신이 실수로 일부 기술자를 선택할 수 가능성은 없습니다. 이 코드는 안전합니다.

동일한 검색어 (예 : employees)에서 비서 및 기술자를 모두 선택하려는 경우 구분 기호가 필요합니다.

+0

사실 Secretaries 테이블에서 데이터를 선택하는 동안 Technician이 UserInterface가 아니기 때문에 결과가 Technician 인스턴스이며 오류가 발생합니다 ... 설명 할 수는 없지만 결과는 큰 문제입니다! –

+0

결국 구조적인 변화가 있기 전에 삽입 된 데이터베이스의 잘못된 데이터 문제였습니다 ... –

관련 문제