ProjectServer.php 2.4 KB
<?php
/**
 * Created by PhpStorm.
 * User: zhl
 * Date: 2023/4/17
 * Time: 15:16
 */

namespace App\Services;

use App\Models\Project;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;

/**
 * Class ProjectServer
 * @package App\Services
 */
class ProjectServer extends BaseService
{
    /**
     * @param $project_id
     * @return Project|false
     */
    public static function useProject($project_id)
    {
        $project = Project::getProjectById($project_id);
        if (empty($project))
            return false;
        // 设置 database.connections.custom_mysql 配置
        config(['database.connections.custom_mysql.host' => $project->mysqlConfig()->host]);
        config(['database.connections.custom_mysql.port' => $project->mysqlConfig()->port]);
        config(['database.connections.custom_mysql.database' => $project->databaseName()]);
        config(['database.connections.custom_mysql.username' => $project->mysqlConfig()->user]);
        config(['database.connections.custom_mysql.password' => $project->mysqlConfig()->password]);
        // 设置 redis 配置
        return $project;
    }


    /**
     * 创建数据库
     * @param $project_id
     * @author zbj
     * @date 2023/4/23
     */
    public static function createDatabase($project_id){
        $project = self::useProject($project_id);
        DB::connection('custom_mysql')->statement("CREATE DATABASE IF NOT EXISTS {$project->databaseName()}");
    }


    /**
     * @param $project_id
     * @return bool
     * @throws \Doctrine\DBAL\Exception
     * @author zbj
     * @date 2023/4/23
     */
    public static function initTable($project_id){
        $project = self::useProject($project_id);
        $database_name = DB::connection('custom_tmp_mysql')->getDatabaseName();

        $table = Schema::connection('custom_tmp_mysql')->getAllTables();
        $table = array_column($table, 'Tables_in_' . $database_name);
        foreach ($table as $v) {
            $has_table = Schema::connection('custom_mysql')->hasTable($v);
            if ($has_table)
                continue;

            $connection = DB::connection('custom_tmp_mysql');
            $sql = $connection->getDoctrineSchemaManager()
                ->getDatabasePlatform()
                ->getCreateTableSQL($connection->getDoctrineSchemaManager()->listTableDetails($v));

            DB::connection('custom_mysql')->select($sql[0]);
        }
        return true;
    }
}