【问题标题】:How to add a new Column to an exesting Table in OctoberCms DB如何在 OctoberCms DB 中的现有表中添加新列
【发布时间】:2020-02-03 21:25:37
【问题描述】:

我正在尝试创建一个新插件,通过添加一个新的 order 列来更新现有表 rainlab_blog_categories

我设法用一个新字段更新了视图,但是我无法成功更新数据库。

我使用 CLI php artisan create:plugin ZiedHf.BlogSorting 搭建了插件骨架。

下面的文件是:Plugin.php 和更新目录下的文件。

看起来第二个没有运行up 方法来更新数据库。

插件.php:

<?php namespace ZiedHf\BlogSorting;

    use Backend;
    use System\Classes\PluginBase;
    use RainLab\Blog\Models\Category as CategoryModel;
    use RainLab\Blog\Controllers\Categories as CategoriesController;
    /**
     * BlogSorting Plugin Information File
     */
    class Plugin extends PluginBase
    {

        const DEFAULT_ICON = 'icon-magic';
        // const LOCALIZATION_KEY = 'ziedhf.blogsorting::lang.';
        const DB_PREFIX = 'ziedhf_blogsorting_';

        public $require = [
            'RainLab.Blog'
        ];

        /**
         * Returns information about this plugin.
         *
         * @return array
         */
        public function pluginDetails()
        {
            return [
                'name'        => 'Blog Sorting',
                'description' => 'Enhance sorting for Blog',
                'author'      => 'Zied Hf',
                'icon'        => 'icon-leaf',
                'homepage'    => 'https://github.com/ziedhf/helloTunisia'
            ];
        }

        /**
         * Boot method, called right before the request route.
         *
         * @return array
         */
        public function boot()
        {
            $this->extendController();
            $this->extendModel();
        }

        /**
         * Extend Categories controller
         */
        private function extendController()
        {
            CategoriesController::extendFormFields(function ($form, $model) {
                if (!$model instanceof CategoryModel) {
                    return;
                }

                $form->addFields([
                    self::DB_PREFIX . 'order' => [
                        'label' => 'Order',
                        'type' => 'number',
                        'comment' => 'Set the order here',
                        'allowEmpty' => true,
                        'span' => 'left'
                    ]
                ]);
            });
        }

        /**
         * Extend Category model
         */
        private function extendModel()
        {
            CategoryModel::extend(function ($model) {
                $model->addDynamicMethod('getBlogSortingOrderAttribute', function() use ($model) {
                    return $model->{self::DB_PREFIX . 'order'};
                });
            });
        }

    }

create_blog_sorting.php 文件:

<?php

namespace ZiedHf\BlogSorting\Updates;

use Schema;
use System\Classes\PluginManager;
use ZiedHf\BlogSorting\Plugin;
use October\Rain\Database\Updates\Migration;

/**
 * Class CreateBlogSorting
 *
 * @package ZiedHf\BlogSorting\Updates
 */
class CreateBlogSorting extends Migration
{

    const TABLE = 'rainlab_blog_categories';

    /**
     * Execute migrations
     */
    public function up()
    {
        if (PluginManager::instance()->hasPlugin('RainLab.Blog')) {
            $this->createFields();
        }
    }

    /**
     * Rollback migrations
     */
    public function down()
    {
        if (PluginManager::instance()->hasPlugin('RainLab.Blog')) {
            $this->dropFields();
        }
    }

    /**
     * Remove new fields
     */
    private function dropFields()
    {
        $this->dropColumn(Plugin::DB_PREFIX . 'order');
    }

    /**
     * Create new fields
     */
    private function createFields()
    {

        if (!Schema::hasColumn(self::TABLE, Plugin::DB_PREFIX . 'order')) {
            Schema::table(self::TABLE, function ($table) {
                $table->integer(Plugin::DB_PREFIX . 'order')->nullable();
            });
        }
    }

    /**
     * @param string $column
     */
    private function dropColumn(string $column)
    {
        if (Schema::hasColumn(self::TABLE, $column)) {
            Schema::table(self::TABLE, function ($table) use ($column) {
                $table->dropColumn($column);
            });
        }
    }
}

这样做的适当方法是什么? 正确执行迁移缺少什么? updates/ 下的文件在我每次运行 php artisan plugin:refresh ZiedHf.Blogsortingphp artisan october:up

时都会被忽略

[已解决] 更新: 问题出在 version.yaml 文件中。 它应该包含 update 文件名:

1.0.1: 
  - First version of BlogSorting
  - create_blog_sorting.php

谢谢!

【问题讨论】:

  • 观看此视频,了解有人如何扩展 user plugin here
  • 能否分享您的updates\version.yaml 文件内容。
  • @HardikSatasiya 您的评论帮助我解决了问题,我不知道 version.yaml 应该包含更新文件名。如果您想在下面添加回复,我会将其标记为正确的。
  • 是的,谢谢,它可以帮助别人:)

标签: laravel octobercms octobercms-plugins


【解决方案1】:

插件有updates\version.yaml 文件,它将跟踪插件的所有数据库更新。

所以请确保your file name [create_blog_sorting.php]updates\version.yaml 内,然后refresh plugin 它应该将迁移文件的更改添加到数据库中,在您的情况下它将添加列:)

示例:

1.0.1: 
  - First version of BlogSorting
  - create_blog_sorting.php <- this one :) 

它应该可以工作:),确保class name 将在CamelCase [ CreateBlogSorting ].File name and entryupdates\version.yaml 将在snake_case [create_blog_sorting.php]

【讨论】:

    猜你喜欢
    • 2021-07-04
    • 1970-01-01
    • 2015-10-26
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2022-11-03
    • 1970-01-01
    相关资源
    最近更新 更多