你可能已经在一些表单中使用过了文档块的注释,这个东西有点像是提供文档的元数据(Metadata)的工具,好比PHPDocumentor(一个利用php代码中的注释生成文档的工具:@author @link等等 在java里这样的工具使用的很广泛) .文档块注释工具在文档环节内嵌了一些元数据,这些数据是能够被代码解析的,过程像是json数据被解析成一个js数组,下面来说讲这些经常使用的annotation语法
php
annotation的实现位于 Doctrine\Common\Annotations 下面
html
俗称表的字段,这个符号标记一个注解的实例变量为持久化的,它必须是在php文档快注释里的实例变量.这个变量里存储的任何值都会被保存起来,而后做为一个实体的生命周期的一部分从数据库里加载.java
@Column中必填的属性:sql
type : doctrine中的类型,在php跟数据库呈现之间转换
数据库
@Column中可选的属性:json
name : 这个属性对应了数据库中字段名,若是不定义 那么表字段名应该跟这个注解的变量名是同样的数组
length : 在string字符串类型的字段中 表示了数据库中字符串的最长长度.Doctrine自己不会验证字符串的长度.缓存
precision : 用于十进制中表示的精度 ( 仅用于十进制的字段 )工具
scale : 十进制数值的范围 (仅用于十进制字段)性能
unique : 意如其名 是不是惟一 值只有true false,决定字段是否应该是惟一的
nullable : 是否能为NULL 跟数据库为空选项同样
columnDefinition : DDL SQL snippet that starts after the column name and specifies the complete (non-portable!) column definition. This attribute allows to make use of advanced RMDBS features. However you should make careful use of this feature and the consequences. SchemaTool will not detect changes on the column correctly anymore if you use “columnDefinition”. ( understand by your understanding )
补充 : 你不要忘了type属性是操纵介于php和数据库值之间的转换,若是你在一个字段中用这个属性来表示join两个表,你能够看看后面的@JoinColumn
实例代码 :
<?php /** * @Column(type="string", length=32, unique=true, nullable=false) */ protected $username; /** * @Column(type="string", columnDefinition="CHAR(2) NOT NULL") */ protected $country; /** * @Column(type="decimal", precision=2, scale=1) */ protected $height;
在sql查询中select短语里的一个字段的引用名.结果范围能够被包含在查询结果中,经过在元数据里设置这个注解.
@ColumnResult必填的属性 :
name : sql语句中select短语的字段名
添加缓存机制到一个顶级的实体或者一个集合.
@Cache可选的属性 :
usage : 能够选的值 - READ_ONLY , READ_READ_WRITE , NONSTRICT_READ_WRITE , 默认值是 READ_ONLY
region : 一个特定的区域名
ChangeTrackingPolity( 中文名真绕口 : 改变追踪政策 )容许设置 doctrine2工做单元应该在Flush期间检测实体属性的变化.默认的每一个实体都经过一个延时机制来检查,这个意味着在flush以前 工做单元结合了全部的实体属性来进行一个快照.这是个盒外工做,然而你可能想经过改变ChangeTrackingPolicy来增强flush时的性能.
这里有个连接 关于详细的ChangeTrackingPolicy:details on all the available change tracking policies
示例代码:
<?php /** * @Entity * @ChangeTrackingPolicy("DEFERRED_IMPLICIT") * @ChangeTrackingPolicy("DEFERRED_EXPLICIT") * @ChangeTrackingPolicy("NOTIFY") */ class User {}
这个注解对于一个继承下来顶级的类是必选的,它设置了一个字段的详细状况,这些东西保存了类名,这个类就是实例化的实体.
@DiscriminatorColumn必填属性 :
name : 鉴别字段名