如何在OctoberCms DB中的新表中添加新列

问题描述 投票:0回答:1

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

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

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

以下文件为:Plugin.php,文件位于更新目录中。

似乎第二个未运行up方法来更新数据库。

Plugin.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);
            });
        }
    }
}

什么是合适的方法?正确执行迁移缺少什么?每次我运行php artisan plugin:refresh ZiedHf.Blogsortingphp artisan october:up时,都会忽略updates /

下的文件

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

1.0.1: 
  - First version of BlogSorting
  - create_blog_sorting.php

谢谢!

laravel octobercms octobercms-plugins
1个回答
0
投票

插件具有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 entry中的updates\version.yaml将位于snake_case [create_blog_sorting.php]

© www.soinside.com 2019 - 2024. All rights reserved.