“字段”概念
在drupal中提到“字段”这个概念时,请不要理解为数据库中表的一个列,这不是一个概念,它是指一个字段对象,充当着实体对象的属性,也是一个列表类型的类型化数据对象,当本系列提到“字段field”一般均是指字段对象或字段定义对象,而数据库表中的字段列,则将其称为“列column”;一个字段对象可以包含数据库表中的多个列(取决于字段类型定义中的schema),这些列称为字段对象的属性,这样的字段叫做多属性字段;由于字段对象是列表类型的数据因此可包含数据库表中的多行数据,具体可以有多少行由字段定义对象中的基数参数决定,每行对应列表中的一个元素,当基数大于一或无限时,这样的字段称为多值字段(注意和多属性字段的区别)。关于字段对象的储存,可以多个字段储存在一张表中,也可以一个字段独立储存在一张属于她的专用表中,在一些特殊情况下一个字段对象还可以被储存在几张数据表中。
储存结构概述:
在一些cms系统中,是先设计数据库表结构,然后再围绕这个结构去开发程序,这很直观,但不够灵活,也不够强大,当需要额外的表时系统不能代为建立和感知,而drupal则不同,在drupal中内容管理主要是基于实体,实体又基于字段,系统是先找出实体所有的字段对象,再根据她们的储存定义自动计算出需要多少数据库表及每个字段应该放置在哪张表中,字段对象和她在数据库中的储存数据表的对应信息由表映射对象托管,而怎么决定这种映射关系,可以参看sql内容实体储存处理器中的getTableMapping方法(见下文),她是系统关于字段和储存表的默认映射规则。
表映射对象:
类:Drupal\Core\Entity\Sql\DefaultTableMapping
接口:\Drupal\Core\Entity\Sql\TableMappingInterface
该对象保存着实体字段对象到数据库表之间的映射信息,该类实例化后是一个没有数据的空对象,必须借助sql内容实体储存处理器为她注入数据,本质上该对象只是一个保存者,决定这种映射关系的逻辑代码实际位于sql内容实体储存处理器的getTableMapping方法中,我们明白了这个方法也就明白了内容实体的表结构。
默认内容实体数据库表结构:
为什么是默认呢?这是因为字段对象我们可以为其定义自定义储存,在默认情况下也是大多数情况下是用系统提供的储存机制,这里我们仅关注默认情况,要知道数据库表结构,需要先明白字段对象和数据库表的对应逻辑,核心代码位于:
Drupal\Core\Entity\Sql\SqlContentEntityStorage::getTableMapping(array $storage_definitions = NULL);
下文我们将详细分析该逻辑,这种对应逻辑适用于所有的内容实体,也就是说所有的内容实体类型的储存数据表遵循共有的规则(如表如何命名、哪些字段放哪个表、有哪些额外附加的列等),在系统中最主要的内容实体类型是节点实体,我们以它作为列子,然后你可以推及到其他内容实体,如用户user实体等。
要建立数据库表,需要知道内