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;
사실 Secretaries 테이블에서 데이터를 선택하는 동안 Technician이 UserInterface가 아니기 때문에 결과가 Technician 인스턴스이며 오류가 발생합니다 ... 설명 할 수는 없지만 결과는 큰 문제입니다! –
결국 구조적인 변화가 있기 전에 삽입 된 데이터베이스의 잘못된 데이터 문제였습니다 ... –