statamic/eloquent-driver

允许您将Statamic数据存储在数据库中。

v4.14.3 2024-09-12 06:00 UTC

README

提供将Statamic数据存储在数据库中而不是平面文件的支持。

安装与使用

您可以使用单个命令安装和配置Eloquent Driver。

php please install:eloquent-driver

该命令将安装 statamic/eloquent-driver 包,发布配置文件,然后提示您选择希望移动到数据库的仓库。然后命令将发布相关迁移并运行 php artisan migrate

该命令还将为您提供机会,表明您是否希望导入现有数据。

导入平面文件内容

如果您最初选择不导入现有内容,但后来改变主意,您可以通过运行相关命令导入现有内容

  • 资产:php please eloquent:import-assets
  • 蓝图和字段集:php please eloquent:import-blueprints
  • 集合:php please eloquent:import-collections
  • 条目:php please eloquent:import-entries
  • 表单:php please eloquent:import-forms
  • 全局:php please eloquent:import-globals
  • 导航:php please eloquent:import-navs
  • 修订:php please eloquent:import-revisions
  • 分类法:php please eloquent:import-taxonomies
  • 站点:php please eloquent:import-sites

同步资产

如果您的资产由Eloquent Driver驱动,并且您在Statamic之外管理资产(例如直接在文件系统中),则应运行 php please eloquent:sync-assets 命令以将任何缺失的文件添加到数据库中,并删除文件系统中不再存在的文件。

导出到平面文件

如果您希望切换回平面文件,可以使用以下命令将内容从数据库导出

  • 资产:php please eloquent:export-assets
  • 蓝图和字段集:php please eloquent:export-blueprints
  • 集合:php please eloquent:export-collections
  • 条目:php please eloquent:export-entries
  • 表单:php please eloquent:export-forms
  • 全局:php please eloquent:export-globals
  • 导航:php please eloquent:export-navs
  • 修订:php please eloquent:export-revisions
  • 分类法:php please eloquent:export-taxonomies
  • 站点:php please eloquent:export-sites

配置

配置文件位于 config/statamic/eloquent-driver.php,在安装Eloquent Driver时会自动发布。

对于每个仓库,它允许您确定它们是否应该由平面文件(file)或Eloquent(eloquent)驱动。一些仓库还有其他选项,例如覆盖使用的模型。

使用专用列存储数据

注意:此功能目前仅适用于条目。

默认情况下,Eloquent Driver将所有数据存储在一个单一的 data 列中。但是,可以将字段存储在其自己的列中。

  1. 首先,您需要在配置文件的 entries 部分中启用 map_data_to_columns 选项

    // config/statamic/eloquent-driver.php
    
    'entries' => [
        'driver' => 'file',
        'model' => \Statamic\Eloquent\Entries\EntryModel::class,
        'entry' => \Statamic\Eloquent\Entries\Entry::class,
        'map_data_to_columns' => false,
    ],
  2. 创建一个新迁移,向 entries 表添加列

    php artisan make:migration add_columns_to_entries_table
    public function up()
    {
        Schema::create('entries', function (Blueprint $table) {
            $table->string('description')->nullable();
            $table->json('featured_images')->nullable();
        });
    }

    您应确保列名与蓝图中的字段处理程序匹配。您还应确保列类型与字段类型匹配。以下是一些常见映射的一般规则

    • 文本字段应存储为string列。
    • 关系字段应存储为json列。(除非将max_items设置为1,在这种情况下,应存储为string列。)
    • 数字字段应存储为integerdecimal列。
  3. 运行迁移

    php artisan migrate
  4. 如果您正在添加jsoninteger列,您将需要提供自己的Entry模型来设置适当的类型转换。您可以通过创建一个新的模型来扩展默认的Entry模型来完成此操作

    <?php
    
    namespace App\Models;
    
    class Entry extends \Statamic\Eloquent\Entries\EntryModel
    {
        protected $casts = [
            // The casts from Statamic's base model...
            'date'      => 'datetime',
            'data'      => 'json',
            'published' => 'boolean',
    
            // Your custom casts...
            'featured_images' => 'json',
        ];
    }

    如果您使用UUID作为条目ID(默认情况下,如果您将现有条目导入数据库,则使用UUID),则应扩展Statamic\Eloquent\Entries\UuidEntryModel

    class Entry extends \Statamic\Eloquent\Entries\UuidEntryModel
  5. 如果您有现有条目,您需要重新保存它们以填充新列。您可以通过将以下代码片段粘贴到php artisan tinker来完成此操作

    \Statamic\Facades\Entry::all()->each->save();
  6. 就这些了!Statamic现在将读取和写入entries表中的新列,而不是data列。

升级

在更新到Eloquent驱动程序的新版本后,请确保您运行php artisan migrate以更新您的数据库到最新模式。

问题

我可以在数据库中存储用户吗?

默认情况下,Statamic用户位于您项目中的users目录。如果您想将它们移动到数据库,请按照此指南操作

我可以将一些集合存储在数据库中,同时保留其他集合为平面文件吗?

此驱动程序无法实现某些集合平面文件驱动,而其他集合Eloquent驱动的功能。如果您正在寻找这样的功能,您可能想查看Runway插件,它是The Rad Pack的一部分。