云客Drupal源码分析之内容实体数据库表结构及表映射table mapping

本文深入分析了Drupal8中内容实体的数据库表结构,特别是字段对象与数据库表的映射关系。介绍了 Drupal 中的字段概念,强调字段并非数据库中的列,而是实体的属性,可包含多个列和行数据。内容实体的存储结构基于实体和字段,表映射对象(DefaultTableMapping)负责字段到数据库表的映射。Drupal8的内容实体通常使用五种类型的数据库表进行存储:基本表、版本表、数据表、版本数据表和字段专用表。通过SqlContentEntityStorage的getTableMapping方法确定字段在表中的分布,根据实体是否可版本化和可翻译,字段会分别存入不同的表。文章以节点实体为例,详细解释了各种表的字段含义,提供了Drupal8.4.0版本的节点实体数据字典。
摘要由CSDN通过智能技术生成

“字段”概念
在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实体等。

 

 

要建立数据库表,需要知道内

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值