thinkphp6 使用自定義命令,生成資料庫檢視

xingduo發表於2024-11-16

ThinkPHP 命令列工具中,你可以為選項設定 別名,透過為選項指定一個簡短的別名來簡化命令輸入。例如,如果你希望 --force-recreate 選項有一個簡短的別名 -f,你可以透過在 addOption 方法中設定第二個引數來實現這一點。

示例:為選項設定別名

addOption 方法的第二個引數中設定別名。這裡是一個包含別名的示例:

<?php
declare (strict_types = 1);

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;
use think\facade\Db;

class CreateViews extends Command
{

    protected function configure()
    {
        // 設定命令名稱和描述
        $this->setName('建立檢視')
        ->setDescription('為資料庫中的所有表生成檢視')
        ->addOption('force-recreate', 'f', Option::VALUE_NONE, '如果檢視已經存在則強制重新建立');
    }

    protected function execute(Input $input, Output $output)
    {

       $forceRecreate = $input->getOption('force-recreate'); 

       $tables =  getAllTables();
        // 獲取是否刪除現有檢視的引數
        if (empty($tables)) {
            $output->writeln('沒有找到任何表!');
            return;
        }
        // 遍歷所有表,為每個表建立檢視
        foreach ($tables as $tableName) {
            $fields = getTableFields($tableName);

            if(!empty($fields)){
                // 初始化欄位對映
                $fieldMappings = [
                    'CREATED_BY' => 'CREATOR_ID',
                    'CREATED_TIME' => 'CREATE_TIME',
                    'UPDATED_BY' => 'UPDATE_USER_ID',
                    'UPDATED_TIME' => 'UPDATE_TIME',
                    'DELETED' => 'DEL_FLAG'
                ];
                // 構建 SELECT 語句
                $selectFields = [];
                foreach ($fields as $columnName) {
                    // 如果表中包含指定欄位,進行重新命名
                    if (array_key_exists($columnName, $fieldMappings)) {
                        $selectFields[] = "$columnName AS " . $fieldMappings[$columnName];
                    } else {
                        $selectFields[] = $columnName;
                    }
                }

                // 生成檢視名稱:使用 'view_' 作為字首
                $viewName = 'view_' . $tableName; // 檢視名稱

                // 檢查檢視是否已經存在
                $viewExists = Db::query("SELECT COUNT(*) as count FROM information_schema.views WHERE table_name = '$viewName' AND table_schema = DATABASE()");

                if ($viewExists[0]['count'] > 0) {
                    if ($forceRecreate) {
                        // 如果檢視存在並且需要強制重建,則先刪除舊檢視
                        Db::query("DROP VIEW IF EXISTS $viewName");
                        $output->writeln("檢視 $viewName 已存在,已刪除舊檢視。");
                    } else {
                        $output->writeln("檢視 $viewName 已存在,跳過建立。");
                        continue; // 跳過當前表,繼續處理下一個表
                    }
                }

                try {
                    // 生成 CREATE VIEW 語句
                    $createViewSql = "CREATE VIEW $viewName AS SELECT " . implode(', ', $selectFields) . " FROM $tableName";
                    Db::query($createViewSql);
                    $output->writeln("檢視 $viewName 建立成功!\n");
                } catch (\think\db\exception\DbException $e) {
                    // 捕獲 SQL 異常
                    $output->writeln("檢視 $viewName 建立失敗!錯誤資訊:" . $e->getMessage());
                }
    
                break;
            }else{
                $output->writeln("表 $tableName 沒有欄位!\n");
            }
        }
    }
}

關鍵點:

  • 別名的設定:在 addOption 方法的第二個引數中設定別名:
    • --force-recreate 的別名是 -f
    • --skip-existing 的別名是 -s

使用命令列時:

你可以透過別名來快速使用選項。例如:

  • 使用 -f 別名代替 --force-recreate

    php think createViews -f
    
  • 使用 -s 別名代替 --skip-existing

    php think createViews -s
    
  • 使用完整選項:

    php think createViews --force-recreate --skip-existing
    

總結:

相關文章