maintable 是织梦内容管理系统中的一个核心概念,它不是一个具体的文件,而是一个系统变量或配置项,主要用于在模板引擎中指定当前需要操作的数据表。

maintable 的作用就是告诉织梦,你当前正在处理的是文章、软件、商品还是其他类型的数据,从而织梦就知道应该去哪个数据表里读取或写入信息。
maintable 的核心作用
在织梦的模板引擎中,很多标签和函数都需要与数据库进行交互,为了通用性和灵活性,织梦不希望每个标签都硬编码一个固定的表名(如 dede_archives),相反,它通过 maintable 这个变量来动态指定数据源。
主要用途包括:
- 指定查询表:
{dede:arclist}、{dede:sql}等标签在获取数据时,会查看maintable的值,决定从哪个表里查询。 - 指定操作表:在进行内容发布、修改等操作时,相关的PHP后端逻辑也会依据
maintable来确定操作的目标数据表。 - 实现通用标签:这使得一套模板可以轻松地适配不同的内容模型,同一个
{dede:arclist}标签,通过改变maintable,既可以用来列出文章,也可以用来列出产品。
maintable 的常见值与对应的数据表
maintable 的值通常是织梦数据表的前缀加上核心表名,织梦默认的数据表前缀是 dede_。

maintable 值 |
对应的数据表 | 说明 |
|---|---|---|
#@__archives |
dede_archives |
文章主表,存储所有通用内容模型(如文章、图集等)的基本信息,如标题、作者、发布时间、点击量等。 |
#@__addonarticle |
dede_addonarticle |
文章附加表,存储文章模型特有的字段,如文章内容(body)、来源、简介等。 |
#@__soft |
dede_soft |
软件模型主表,存储软件的基本信息,如软件名称、版本、大小、授权方式等。 |
#@__addonsoft |
dede_addonsoft |
软件模型附加表,存储软件特有的字段,如软件下载地址、演示地址、软件截图等。 |
#@__product |
dede_product |
商品模型主表,存储商品的基本信息。 |
#@__addonproduct |
dede_addonproduct |
商品模型附加表,存储商品特有的字段,如价格、品牌、规格参数等。 |
#@__feedback |
dede_feedback |
评论表,用于存储用户对内容的评论。 |
注意:
#@__是织梦在解析模板时自动替换为你在后台配置的数据表前缀的占位符,如果你的前缀是abc_,#@__archives最终会变成abc_archives。
maintable 在哪里设置和使用?
maintable 的设置和使用场景主要分为两类:
a. 在模板标签中直接指定
这是最常见的方式,特别是在使用 {dede:sql} 标签进行自定义查询时,你可以通过 maintable 属性来覆盖默认的表。
示例1:使用 {dede:sql} 查询文章

如果你想直接用SQL语句查询文章,可以这样写:
{dede:sql sql='SELECT id, title FROM #@__archives WHERE typeid=1'}
<a href="/plus/view.php?aid=[field:id/]">[field:title/]</a>
{/dede:sql}
在这个例子中,织梦默认会从 #@__archives 表查询,如果你想明确指定,也可以加上 maintable:
{dede:sql sql='SELECT id, title FROM maintable WHERE typeid=1' maintable=' #@__archives '}
<a href="/plus/view.php?aid=[field:id/]">[field:title/]</a>
{/dede:sql}
虽然在这里不写 maintable 也能工作,但在更复杂的查询或不同模型混合使用时,显式指定可以避免混淆。
b. 在PHP后端代码中动态设置
当你在开发织梦插件或修改核心文件时,通常会在PHP代码中设置 $maintable 这个全局变量。
典型场景:内容模型页面
当你访问一个文章、软件或商品的详情页时(plus/view.php),PHP代码会根据你访问的内容ID,从 #@__archives 表中查出记录,它会根据记录的 channel(频道)类型,来确定具体是哪个内容模型,并动态设置 $maintable。
在 plus/view.php 中,可能会有类似这样的逻辑:
// ... 省略部分代码 ...
$aid = (isset($aid) && is_numeric($aid)) ? $aid : 0;
if($aid == 0) {
ShowMsg('无此文档', '-1');
exit();
}
// 查询主表获取基本信息
$row = $dsql->GetOne("SELECT * FROM `#@__archives` WHERE id='$aid'");
// 根据频道类型设置附加表和主表
$channelid = $row['channel']; // 获取频道ID
$addtable = $dsql->GetOne("SELECT addtable FROM `#@__channeltype` WHERE id='$channelid'");
$maintable = $addtable['addtable']; // 这里的 $maintable 就被设置成了如 #@__addonarticle 这样的值
// 如果附加表存在,则查询附加表信息
if($maintable != '') {
$addrow = $dsql->GetOne("SELECT * FROM `$maintable` WHERE aid='$aid'");
// 将附加表信息合并到主表信息中
if(is_array($addrow)) {
$row = array_merge($row, $addrow);
}
}
// ... 然后将 $row 变量传递给模板引擎进行解析 ...
通过这种方式,织梦的 view.php 一个文件就能处理所有类型的内容详情页,非常灵活。
一个实际的例子
假设你的网站有一个“软件下载”频道,你想在首页调用最新的5个软件。
- 后台创建模型:在后台创建一个“软件”模型,系统会自动创建
dede_soft和dede_addonsoft两个表。 - 编写模板标签:在首页模板文件(如
index.htm)中,使用{dede:arclist}标签,并指定channelid和maintable。
{dede:aricle channelid='3' row='5' titlelen='30'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>大小:[field:softsize/]</span>
<span>授权:[field:auth/]</span>
</li>
{/dede:aricle}
channelid='3':告诉织梦,我们要调用频道ID为3的内容(也就是你创建的“软件”频道)。- 织梦内部会根据这个
channelid找到对应的附加表#@__addonsoft,并自动将其设置为当前的$maintable。 {dede:aricle}标签在解析时,就会从#@__addonsoft表中获取softsize和auth等字段。
| 特性 | 描述 |
|---|---|
| 本质 | 一个动态的、可配置的数据表标识符,而非固定文件。 |
| 作用 | 指示织梦模板引擎当前应操作哪个数据库表,是实现内容模型通用性的关键。 |
| 核心价值 | 灵活性和可扩展性,一套模板可以适配多种内容类型,无需为每种类型都写一套模板。 |
| 使用场景 | 主要在模板标签(如 {dede:sql})和PHP后端逻辑中,用于数据查询和内容操作。 |
| 与附加表的关系 | 对于文章、软件等模型,数据通常分布在主表(archives)和附加表(addonarticle)中。maintable 通常指向附加表,因为附加表包含了模型特有的字段。 |
理解 maintable 是深入掌握织梦系统工作原理,特别是进行二次开发和模板定制的重要一步,它就像一个“数据源切换器”,让织梦能够灵活地处理不同类型的内容。
