DoctorineのAnnotation
Table自体のannotation
Entityのclass定義の上に書く
code:ProductEntity.php
<?php
/**
* @ORM\Entity
* @ORM\Table(name="products")
*/
class Product {
..
}
@Table
tableとclassのmapping定義
table名、index制約など
@UniqueConstraint
UNIQUE制約を書く
@Entity
このclassがEntityであることをDoctrineに知らせる
@DiscriminatorColumn
@DiscriminatorMap
@InheritanceType
@Index
@HasLifecycleCallbacks
@Id
class内の複数のpropertyを主キーとする際には複数箇所にこれを書く
@GeneratedValue
@Idの値をどのように生成するのかを指定する
つまり主キーをどういうルールで生成するかを指定する
例えば、新規アイテムを追加する際に連番で新しい数値を自動で振って欲しい、とか
@Idが指定されている場合にのみ意味がある
@ManyToOne
2つのEntity間の、多対1の関係
こちら側がMany、targetがOne
targetEntity
inversedBy
所属する側のデータ($parent)には inversedByとJoinColumnを付与する
fetch
LAZYとEAGERのいずれかを指定できる
@OneToMany
所属される側のデータ($childs)には mappedByを付与する
@JoinColumnsをつかうのか
fetch
@ManyToMany
fetch
@OneToOne
One to Oneなので、mappedByとかはない
fetch
LAZY, EAGER
Extra_Lazyとは
これってリレーション張りたかったら、絶対に両者のEntityに指定しないといけないんだっけ?
片側から見えてたらそれで良い、というのもあると思うんだけど
普通にSQLでtable作成するときに指定するような項目 DBのcolumnに対する項目をここで指定する
例えばtype="integer"とか、nullableかどうかとか
@ColumnResult
@Cache
@ChangeTrackingPolicy
@CustomIdGenerator
@Embeddable
@Embedded
@EntityResult
@FieldResult
@JoinColumn
こちら側のpropertyと、相手側のEntityを紐付ける際にどのkeyでJoinするかを指定する
例えば、Customerと関係したいときに、
こちら側(Hoge)のpropety名をCustomerとする(CustomerIdではなく)
これで、Hoge->Customerで関係するCustomer Entityをまるごと取ってこれる
この際に、どのkeyでHogeとCustomerを結合させるのかを、ここで指定する
code:php
/**
* @OneToOne(targetEntity="Customer")
* @JoinColumn(name="customer_id", referencedColumnName="id")
*/
private $Customer;
name
こちら側のtableで表示するidの名前を指定する
上の例では、table上ではcolumn名はcutomer_idとなって、リンクで該当のCustomerへ飛ぶ感じになる
referencedColumnName
結合条件とする、相手側のproperty名
@JoinColumns
複数の@JoinColumnを指定する
referencedColumnName
@JoinTable
@MappedSuperclass
@NamedNativeQuery
@OrderBy
@ORM\OrderBy({"hoge" = "DESC"})
相手のEntityのpropertyだとは思うが、
相手のEntityのproperty名なのか、tableのfield名なのか?
特に名前がずれているとき
OrderByに限らないけど、あとからこの指定を追加したときってどうやったら反映されるのか?
書くだけでもうokなのか?
@PostLoad
@PostPersist
@PostRemove
@PostUpdate
@PrePersist
@PreRemove
@PreUpdate
@SequenceGenerator
@SqlResultSetMapping
@Version