[php] InversedBy와 mappedBy의 차이점은 무엇입니까?


Answers

위의 대답은 내가 무슨 일이 일어나고 있는지 이해하기에 충분하지 않았기 때문에 더 깊이 파고 들자 나는 그것을 이해하는 것처럼 고뇌했던 사람들에게 이해할 수있는 방법을 설명 할 수 있다고 생각합니다.

inversedBy 및 mappedBy는 INTERNAL DOCTRINE 엔진에서 필요한 정보를 얻기 위해 수행해야하는 SQL 쿼리 수줄이기 위해 사용됩니다. inversedBy 또는 mappedBy를 추가하지 않으면 코드는 계속 작동하지만 최적화 되지는 않습니다.

예를 들어 아래 클래스를 살펴보십시오.

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

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

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="dueDate", type="datetime")
     */
    private $dueDate;

    /**
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="tasks", cascade={"persist"})
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    protected $category;
}

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

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

    /**
     * @ORM\OneToMany(targetEntity="Task", mappedBy="category")
     */
    protected $tasks;
}

이 클래스는 스키마 생성 명령 (예 : bin/console doctrine:schema:update --force --dump-sql )을 실행하는 경우 Category 테이블에 작업에 대한 열이 없다는 것을 알 수 있습니다 . (이것은 열 주석이 없기 때문입니다)

여기에서 이해해야 할 중요한 점은 가변적 인 작업은 내부 교리 엔진이 mappedBy 카테고리라고 말하는 위의 참조를 사용할 수 있도록하는 것입니다. 자 ... 내가 여기있는 것처럼 혼동 하지 마세요 ... 카테고리는 클래스 이름을 언급하지 않습니다.이 클래스는 'protected $ category'라는 Task 클래스의 속성을 참조합니다.

현명한 것처럼, Tasks 클래스에서 $ category라는 속성은 inversedBy = "tasks"라고 언급하고 있는데, 이것이 복수라는 것을 알 수 있습니다. 이것은 클래스 이름의 복수형이 아니지만 카테고리의 'protected $ tasks' 수업.

이것을 이해하면 inversedBy 및 mappedBy가 수행중인 작업과이 상황에서이 작업을 사용하는 방법을 이해하는 것이 매우 쉽습니다.

내 예제에서 'tasks'와 같은 외래 키를 참조하는 측면은 inversedBy 특성을 가져옵니다. 왜냐하면 targetEntity 명령을 통해 어떤 클래스를, 그리고 '역방향으로 작업 할'해당 클래스의 어떤 변수 (inversedBy =)를 알아야하기 때문입니다. 에서 카테고리 정보를 말하고 얻으십시오. 이를 기억하는 쉬운 방법은 foreignkey_id가 inversedBy를 가져야하는 클래스 인 클래스입니다.

카테고리와 $ tasks 속성 (테이블에 기억되지 않고 최적화 목적으로 클래스의 일부만 기억)이 MappedBy 'tasks'인 경우, 이것은 두 엔티티 사이의 관계를 공식적으로 생성하여 doctrine이 이제 안전하게 수행 할 수있게합니다 별도의 두 SELECT 문 대신 JOIN SQL 문을 사용하십시오. mappedBy가 없다면, doctrine 엔진은 JOIN 문에서 카테고리 정보를 넣기 위해 'Task'클래스에서 어떤 변수를 생성하는지 알 수 없습니다.

희망이 좀 더 그것을 설명합니다.

Question

Zend Framework 2와 Doctrine 2를 사용하여 애플리케이션을 개발 중입니다.

어노테이션을 쓰는 동안 mappedBymappedBy 의 차이점을 이해할 수 없습니다.

mappedBy 는 언제 사용해야합니까?

inversedBy 언제 사용해야합니까?

둘 중 어느 것을 사용해야합니까?

다음은 그 예입니다.

 /**
 *
 * @ORM\OneToOne(targetEntity="\custMod\Entity\Person", mappedBy="customer")
 * @ORM\JoinColumn(name="personID", referencedColumnName="id")
 */
protected $person;

/**
 *
 * @ORM\OneToOne(targetEntity="\Auth\Entity\User")
 * @ORM\JoinColumn(name="userID", referencedColumnName="id")
 */
protected $user;

/**
 *
 * @ORM\ManyToOne (targetEntity="\custMod\Entity\Company", inversedBy="customer")
 * @ORM\JoinColumn (name="companyID", referencedColumnName="id")
 */
protected $company;

나는 빠른 검색을했고 다음과 같은 것을 발견했다. 그러나 나는 아직도 혼란 스럽다.




5.9.1. 소유 및 반비례

다 대 다 연관의 경우 엔티티를 소유하고 반대면을 선택할 수 있습니다. 개발자 관점에서 어느면이 소유면에 더 적합한 지 결정하는 매우 간단한 의미 규칙이 있습니다. 연결 관리를 담당하는 엔티티는 자신에게만 묻고 소유 측으로 선택하십시오.

두 엔티티 Article 및 Tag의 예를 들어보십시오. 기사를 태그에 연결하거나 그 반대의 경우에는 항상이 관계를 담당하는 기사입니다. 새 기사를 추가 할 때마다 기존 또는 새 태그와 연결하려고합니다. 기사 작성 양식은이 개념을 지원하고 직접 태그를 지정할 수 있도록합니다. 이것이 코드를 이해할 수있게 만들기 때문에 소유권을 주장하는 이유입니다.

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html






Links