如何写一个驱动模式与替代语法
概述
从symfoob娱乐下载ny 1.1开始,您可以选择用新的YAML语法描述模型的关系结构。ob娱乐下载Symfony承认schema.yml
使用symfony Book第8章中描述的语法或下面描述的语法编写的文件。ob娱乐下载替代语法更面向对象,使几个模式的合并过程更容易理解。
基地的例子
考虑下面的模式,使用当前语法:
propel: _attributes: {noXsd: false, defaultIdMethod: none, package: lib。模型}ab_group: _attributes: {phpName: Group, package: foo.bar.lib.model} id: name: varchar(50) cd_user: _attributes: {phpName: User, isI18N: true, i18nTable: cd_user_i18n} first_name: {type: varchar, size: 255, default:“匿名”}last_name: varchar(50) age: {type: integer, required: true, index: true} ab_group_id: created_at: cd_user_i18n: description: longvarchar ef_article: title: {type: longvarchar, required: true, index: unique} stripped_title: {type: longvarchar, required: true, index: unique} stripped_title: {type: longvarchar, required: true, required: unique:true, primaryKey: true, sequence: my_custom_sequence_name} user_id: my_group: {type: integer, foreignTable: ab_group, foreignReference: id, onDelete: setnull} created_at: timestamp updated_at: ij_article: _attributes: {phpName: Article} title: varchar(50) user_id: {type: integer} _foreignKeys: - foreignTable: cd_user onDelete: cascade references: - {local: user_id, foreign: id} created_at: _indexes: my_index: [title, user_id] _uniques: my_other_index: [created_at] _behaviors: paranoid: paranoid:{column: deleted_at} ab_group_i18n:座右铭:longvarchar
替代语法
基本示例,使用替代语法
下面是如何使用另一种语法编写与上面列出的结构完全相同的结构:
nodesd: false defaultIdMethod: none类: Group: tableName: ab_group package: foo.bar.lib.model columns: id: name: varchar(50) User: tableName: cd_user isI18N: true i18nTable: cd_user_i18n columns: first_name: { type: varchar, size: 255, default: "Anonymous" } last_name: varchar(50) age: { type: integer, required: true, index: true } ab_group_id: created_at: CdUserI18n: columns: description: longvarchar EfArticle: columns: title: { type: longvarchar, required: true, index: unique } stripped_title: { type: longvarchar, required: true, primaryKey: true, sequence: my_custom_sequence_name } user_id: my_group: { type: integer, foreignClass: Group, foreignReference: id, onDelete: setnull } created_at: timestamp updated_at: Article: tableName: ij_article columns: title: varchar(50) user_id: { type: integer } created_at: foreignKeys: - foreignTable: cd_user onDelete: cascade references: - { local: user_id, foreign: id } indexes: my_index: [title, user_id] uniques: my_other_index: [created_at] behaviors: paranoid: { column: deleted_at } AbGroupI18n: columns: motto: longvarchar
主要区别是使用表声明类,而不是表phpName
作为钥匙。
这种替代语法也更显式,因为必须为类
而且列
.但它去掉了丑陋的部分_attributes
对当前语法的破解,所以aschema.yml
不试图模仿XML语法。
最后但并非最不重要的是,经典语法的所有“魔力”仍然存在(自动定义主键、外键、i18n表等)。
连接设置
而不是被定义为_attributes
对于连接,连接设置和连接名称都是1级键:
nodesd: false defaultIdMethod: none
所有这些键都是可选的,包括连接
一个。如果它没有设置,symfony将采取ob娱乐下载推动
作为默认值。
类
类定义以自然的键/值语法列出了数据库中的表名、列、外键、索引和行为:
Article: tableName: ij_article columns: title: varchar(50) user_id: {type: integer} created_at: foreignKeys: - foreignTable: cd_user onDelete: cascade references: - {local: user_id, foreign: id} indexes: my_index: [title, user_id] uniques: my_other_index: [created_at] behaviors: paranoid: {column: deleted_at}
注意,可以使用usual定义外键foreignTable
属性,该属性需要一个表名,或通过newforeignClass
属性,该属性需要一个类名。
混合模式
在项目中,可以使用混合当前语法和替代语法的模式。
symfony书籍的第17章描述了模式扩展系统,无论原始模式语法如何,无论自定义模式语法如何,它都可以工作。ob娱乐下载这意味着您可以使用具有替代语法的自定义模式定制具有经典语法的现有模式,反之亦然。ob娱乐下载Symfony将在内部进行转换,以便始终可以进行合并。
请注意,在考虑原始模式和自定义模式的替代语法时,模式合并更容易理解。事实上,这是symfony用于合并的内部格式。ob娱乐下载下面的清单显示了模式是如何合并的:
#原始模式,在plugins/myPlugin/config/schema中。yml类:User: tableName: cd_user columns: first_name: {type: varchar, size: 255, default:“匿名”}last_name: varchar(50) age: {type: integer, required: true, index: true} created_at: Article: tableName: ij_article columns: title: varchar(50) user_id: {type: integer} created_at: foreignKeys: - foreignTable: cd_user onDelete:级联引用:-{本地:user_id,外部:id} #自定义模式,在myPlugin_schema.custom中。yml connection: myConnection classes: Group: tableName: ab_group package: foo.bar.lib.model behavior: [paranoid] columns: id: name: varchar(50) User: tableName: ef_user isI18N: true i18nTable: cd_user_i18n columns: ab_group_id: Article: columns: updated_at: #结果模式,内部合并并用于模型和sql生成connection: myConnection classes: Group: tableName: ab_group package: foo.bar.lib.model behavior: [paranoid] columns: id: name: varchar(50) User: tableName: tableName: varchar(50) User: tableName: tableName: varchar(50)cd_user isI18N: true i18nTable: cd_user_i18n columns: first_name: {type: varchar, size: 255, default:“匿名”}last_name: varchar(50) age: {type: integer, required: true, index: true} ab_group_id: created_at: Article: tableName: ij_article columns: title: varchar(50) user_id: {type: integer} created_at: updated_at: foreignKeys: - foreignTable: cd_user onDelete:级联引用:- {local: user_id, foreign: id}
为了清晰起见,建议尽可能使用替代模式语法。
本作品采用创作共用署名-非商业性-禁止派生作品3.0未移植许可协议授权。