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

namespace App\Services;

use App\Models\Project\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;

        if(!$project->mysqlConfig){
            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
     * @return bool
     * @author zbj
     * @date 2023/4/23
     */
    public static function createDatabase($project)
    {
        $conn = new \mysqli(
            $project->mysqlConfig->host,
            $project->mysqlConfig->user,
            $project->mysqlConfig->password,
            '',
            $project->mysqlConfig->port,
        );
        $conn->query("CREATE DATABASE IF NOT EXISTS {$project->databaseName()}");
        return true;
    }


    /**
     * @param $project
     * @return bool
     * @author zbj
     * @date 2023/4/23
     */
    public static function initTable($project)
    {
        $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;
            }

            $sql = DB::connection('custom_tmp_mysql')->select("SHOW CREATE TABLE {$v}");
            DB::connection('custom_mysql')->statement(get_object_vars($sql[0])['Create Table']);
        }
        return true;
    }
}