Ad

How To Add A New Column To An Exesting Table In OctoberCms DB

- 1 answer

I'm trying to create a new Plugin to update an existing table rainlab_blog_categories by adding a new order column.

I managed to update the view with a new field, however I'm not able to update the DB successfully.

I used the CLI php artisan create:plugin ZiedHf.BlogSorting to scaffold the Plugin skeleton.

The files below are : Plugin.php and file inder the updates directory.

It looks like the second one does not run up method to update the DB.

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 file :

<?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);
            });
        }
    }
}

What is the appropriate way to do this ? What is missing to execute the migration correctly ? The file under updates/ was just ignored each time I run php artisan plugin:refresh ZiedHf.Blogsorting or php artisan october:up

[SOLVED] Update : The problem was in the version.yaml file. It should contain the update file name :

1.0.1: 
  - First version of BlogSorting
  - create_blog_sorting.php

Thanks !

Ad

Answer

Plugin has updates\version.yaml file which will track all the database updates for plugins.

So make sure your file name [create_blog_sorting.php] is inside updates\version.yaml, then refresh plugin it should add changes of migration file to database in your case it will add column :)

Example:

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

It should work :), make sure class name will be in CamelCase [ CreateBlogSorting ].File name and entry in updates\version.yaml will be in snake_case [create_blog_sorting.php]

Ad
source: stackoverflow.com
Ad