Symfony2를 사용하여 상속 자식 엔티티를 UserInterface로 설정하는 방법

플로 쉴드

symfony2의 "Class Table Inheritance"모델을 사용하는 상속이있는 데이터베이스 모델이 있습니다.

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

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

비서가 기술자를 위해 몇 가지 사항을 관리 할 수있는 응용 프로그램을 구축 중이므로 몇 가지 양식 등이있는 관리자 패널이 있습니다.

비서 저장소는 또한 비서가 응용 프로그램을 통해 인증 할 수있는 UserProvider 인터페이스입니다.

내가 가진 문제는 인증 쿼리가 판별자를 신경 쓰지 않는다는 것입니다 ...

인증 SQL 쿼리 의 디버그

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 = ?

비서와 직원 간의 관계를 관리하는 방법을 이해하지 못합니다. 비서에서 직원으로의 외래 키를 수동으로 포함해야합니까? 아니면 인증 쿼리에서 판별자를 수동으로 처리해야합니까?

내 모델의 기본 사항을 살펴 보겠습니다.

부모 클래스 직원

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의 클래스 SecretaryRepository

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
}

문제는 간단합니다. INNER JOIN 절은 비서에서 직원에게 외래 키를 사용하지 않고 직접 ID를 사용하기 때문에 올바르지 않습니다. 기술자 ID도 될 수 있습니다!

다음은 내 테이블의 일부 행을 내보내는 것입니다.

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;
Crozin

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

동일한 쿼리에서 비서와 기술자를 모두 선택하려는 경우, 즉 쿼리가 employees테이블 에서 선택하는 경우 식별기가 필요 합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

저장된 엔터티 및 해당 자식 속성에서 Entity Framework를 사용하여 CreatedOn 필드를 자동으로 설정하는 방법

분류에서Dev

symfony2 양식으로 제출 된 엔티티의 ID를 얻는 방법

분류에서Dev

연결된 엔티티의 속성을 사용하여 클래스 속성을 Symfony 양식 입력으로 설정하는 방법

분류에서Dev

Symfony2에서 엔티티의 기본 / 보조 / 정상 상태를 처리하는 방법

분류에서Dev

자동 증가 ID를 사용하여 JPA의 엔티티에 다른 변수를 설정하는 방법

분류에서Dev

Symfony2 : 하나의 엔티티 속성에 두 개의 양식 필드를 사용합니까?

분류에서Dev

JWT 토큰으로 여러 사용자 엔티티를 구성하는 방법은 무엇입니까?

분류에서Dev

CRM 사용자 지정 엔터티를 대량로드하는 방법

분류에서Dev

현재 인증 된 사용자를 엔터티에서 참조로 설정하는 방법

분류에서Dev

Symfony 3 : 엔티티를 동적으로 조작하는 방법?

분류에서Dev

ColdBox에서 엔티티를 고유 키로 설정하는 방법

분류에서Dev

Symfony2에서 확장 된 엔티티를 이해하는 방법

분류에서Dev

교리-Symfony2 | 동일한 엔티티를 대상으로하는 다 대다

분류에서Dev

자바 스크립트로 HTML 엔티티를 반복하는 방법

분류에서Dev

부모 측 Set 컬렉션을로드하지 않고 Hibernate 자식 엔티티를 유지하는 방법

분류에서Dev

특정 기준을 가진 중첩 된 엔티티로 nHibernate 엔티티를 반환하는 방법

분류에서Dev

JPA / Hibernate 엔티티의 특정 필드를 다른 엔티티로 결합하는 방법

분류에서Dev

Datomic에서 여러 속성 중 하나를 사용하여 엔티티를 찾는 방법

분류에서Dev

Symfony2 양식-관련 엔티티의 필드를 자동으로 채우는 방법은 무엇입니까?

분류에서Dev

tinyxml2를 사용하여 XML에서 부모 및 자식 엔터티를로드하는 방법은 무엇입니까?

분류에서Dev

SpecFlow-사용자 정의 유형을 사용하여 엔티티에 테스트 데이터를 설정하는 방법

분류에서Dev

사용자 엔티티 결과를 조치 클래스에서 view.jsp로 전달하는 방법

분류에서Dev

linq에 중첩 된 자식 엔티티를 포함 ()하는 방법

분류에서Dev

HttpURLConnection에 엔티티를 설정하는 방법

분류에서Dev

Jhipster, 엔티티를 지연로드하는 방법 ... Pom 구성,

분류에서Dev

ID로 엔티티를 결합하는 방법

분류에서Dev

하나의 Symfony 양식에서 두 엔티티를 매핑하는 방법

분류에서Dev

Javascript를 사용하여 Dynamics CRM 엔티티 레코드 데이터 및 상태를 활성에서 비활성으로 변경 / 업데이트하는 방법

분류에서Dev

하위 엔티티의 필드를 기반으로 Hazelcast 맵에서 엔티티를 가져 오는 방법

Related 관련 기사

  1. 1

    저장된 엔터티 및 해당 자식 속성에서 Entity Framework를 사용하여 CreatedOn 필드를 자동으로 설정하는 방법

  2. 2

    symfony2 양식으로 제출 된 엔티티의 ID를 얻는 방법

  3. 3

    연결된 엔티티의 속성을 사용하여 클래스 속성을 Symfony 양식 입력으로 설정하는 방법

  4. 4

    Symfony2에서 엔티티의 기본 / 보조 / 정상 상태를 처리하는 방법

  5. 5

    자동 증가 ID를 사용하여 JPA의 엔티티에 다른 변수를 설정하는 방법

  6. 6

    Symfony2 : 하나의 엔티티 속성에 두 개의 양식 필드를 사용합니까?

  7. 7

    JWT 토큰으로 여러 사용자 엔티티를 구성하는 방법은 무엇입니까?

  8. 8

    CRM 사용자 지정 엔터티를 대량로드하는 방법

  9. 9

    현재 인증 된 사용자를 엔터티에서 참조로 설정하는 방법

  10. 10

    Symfony 3 : 엔티티를 동적으로 조작하는 방법?

  11. 11

    ColdBox에서 엔티티를 고유 키로 설정하는 방법

  12. 12

    Symfony2에서 확장 된 엔티티를 이해하는 방법

  13. 13

    교리-Symfony2 | 동일한 엔티티를 대상으로하는 다 대다

  14. 14

    자바 스크립트로 HTML 엔티티를 반복하는 방법

  15. 15

    부모 측 Set 컬렉션을로드하지 않고 Hibernate 자식 엔티티를 유지하는 방법

  16. 16

    특정 기준을 가진 중첩 된 엔티티로 nHibernate 엔티티를 반환하는 방법

  17. 17

    JPA / Hibernate 엔티티의 특정 필드를 다른 엔티티로 결합하는 방법

  18. 18

    Datomic에서 여러 속성 중 하나를 사용하여 엔티티를 찾는 방법

  19. 19

    Symfony2 양식-관련 엔티티의 필드를 자동으로 채우는 방법은 무엇입니까?

  20. 20

    tinyxml2를 사용하여 XML에서 부모 및 자식 엔터티를로드하는 방법은 무엇입니까?

  21. 21

    SpecFlow-사용자 정의 유형을 사용하여 엔티티에 테스트 데이터를 설정하는 방법

  22. 22

    사용자 엔티티 결과를 조치 클래스에서 view.jsp로 전달하는 방법

  23. 23

    linq에 중첩 된 자식 엔티티를 포함 ()하는 방법

  24. 24

    HttpURLConnection에 엔티티를 설정하는 방법

  25. 25

    Jhipster, 엔티티를 지연로드하는 방법 ... Pom 구성,

  26. 26

    ID로 엔티티를 결합하는 방법

  27. 27

    하나의 Symfony 양식에서 두 엔티티를 매핑하는 방법

  28. 28

    Javascript를 사용하여 Dynamics CRM 엔티티 레코드 데이터 및 상태를 활성에서 비활성으로 변경 / 업데이트하는 방법

  29. 29

    하위 엔티티의 필드를 기반으로 Hazelcast 맵에서 엔티티를 가져 오는 방법

뜨겁다태그

보관