selcukmart/sqlbuilder 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

selcukmart/sqlbuilder

Composer 安装命令:

composer require selcukmart/sqlbuilder

包简介

Modern PHP 8.1+ SQL query builder with fluent interface for Laravel, Symfony and standalone use

README 文档

README

PHP Version License Tests

Modern, fluent SQL query builder for PHP 8.1+ with built-in security, framework integration, and comprehensive SQL support.

✨ Features

  • 🔒 Secure by Default - Automatic parameter binding prevents SQL injection
  • ⛓️ Fluent API - Intuitive method chaining for readable code
  • 🎯 Type-Safe - Full PHP 8.1+ type declarations with enums
  • 🚀 Framework Ready - Native Laravel & Symfony integration
  • 📦 Complete SQL Support - DML, DDL, and utility operations
  • 🧪 Well Tested - 90%+ code coverage
  • 📖 Well Documented - Comprehensive guides and examples

📋 Supported SQL Operations

✅ DML (Data Manipulation)

  • ✅ SELECT - With joins, subqueries, grouping
  • ✅ INSERT - Single & multiple rows
  • ✅ UPDATE - With conditions
  • ✅ DELETE - With conditions
  • ✅ REPLACE - MySQL REPLACE operation
  • ✅ TRUNCATE - Fast table truncation

✅ DDL (Data Definition)

  • ✅ CREATE TABLE - Full table creation with constraints
  • ✅ CREATE INDEX - Simple & composite indexes
  • ✅ DROP - Tables, indexes, databases
  • ✅ RENAME - Table renaming

✅ Utility Operations

  • ✅ SHOW - Tables, databases, columns, indexes
  • ✅ DESCRIBE - Table structure
  • ✅ EXPLAIN - Query analysis
  • ✅ SET - Session variables

📦 Installation

composer require selcukmart/sqlbuilder

Requirements

  • PHP 8.1 or higher
  • Composer 2.0+

🚀 Quick Start

use SelcukMart\SQLBuilder\SQLBuilder;

// Simple SELECT query
$query = SQLBuilder::table('users')
    ->select('id', 'name', 'email')
    ->where('status', '=', 'active')
    ->orderBy('created_at')
    ->limit(10)
    ->getSQL();

echo $query;
// SELECT id, name, email FROM users WHERE status = :param_0 ORDER BY created_at ASC LIMIT 10

// Get parameter bindings for prepared statements
$bindings = $builder->getBindings();
// ['param_0' => 'active']

📖 Complete Usage Guide

SELECT Queries

Basic SELECT

// Select all columns
$query = SQLBuilder::table('users')->getSQL();
// SELECT * FROM users

// Select specific columns
$query = SQLBuilder::select('id', 'name', 'email')
    ->from('users')
    ->getSQL();
// SELECT id, name, email FROM users

WHERE Clauses

// Simple WHERE
$builder = SQLBuilder::table('users')
    ->where('age', '>', 18)
    ->where('status', '=', 'active');

// WHERE with OR
$builder = SQLBuilder::table('users')
    ->where('role', '=', 'admin')
    ->orWhere('role', '=', 'moderator');

// WHERE IN
$builder = SQLBuilder::table('users')
    ->whereIn('id', [1, 2, 3, 4, 5]);

// WHERE BETWEEN
$builder = SQLBuilder::table('products')
    ->whereBetween('price', 10.00, 100.00);

JOIN Operations

// INNER JOIN
$query = SQLBuilder::select('u.name', 'p.title')
    ->from('users', 'u')
    ->innerJoin('posts', 'p.user_id', '=', 'u.id', 'p')
    ->getSQL();

// LEFT JOIN
$query = SQLBuilder::table('users', 'u')
    ->leftJoin('profiles', 'profiles.user_id', '=', 'u.id', 'pr')
    ->getSQL();

// Multiple JOINS
$query = SQLBuilder::table('users', 'u')
    ->leftJoin('profiles', 'profiles.user_id', '=', 'u.id', 'pr')
    ->leftJoin('settings', 'settings.user_id', '=', 'u.id', 's')
    ->where('u.active', '=', true)
    ->getSQL();

GROUP BY & HAVING

use SelcukMart\SQLBuilder\Enums\OrderDirection;

$query = SQLBuilder::select('category', 'COUNT(*) as total')
    ->from('products')
    ->groupBy('category')
    ->having('COUNT(*)', '>', 5)
    ->orderBy('total', OrderDirection::DESC)
    ->getSQL();

INSERT

// Single row INSERT
$builder = SQLBuilder::insert()
    ->into('users')
    ->values([
        'name' => 'John Doe',
        'email' => 'john@example.com',
        'age' => 30
    ]);

// Multiple rows INSERT
$builder = SQLBuilder::insert()
    ->into('users')
    ->multipleValues([
        ['name' => 'John', 'email' => 'john@example.com'],
        ['name' => 'Jane', 'email' => 'jane@example.com'],
        ['name' => 'Bob', 'email' => 'bob@example.com']
    ]);

UPDATE

// Simple UPDATE
$builder = SQLBuilder::update('users')
    ->set([
        'name' => 'John Updated',
        'email' => 'john.new@example.com'
    ])
    ->where('id', '=', 1);

// UPDATE with multiple conditions
$builder = SQLBuilder::update('users')
    ->set(['status' => 'inactive'])
    ->where('last_login', '<', '2023-01-01')
    ->where('email_verified', '=', false)
    ->limit(100);

DELETE

// Simple DELETE
$builder = SQLBuilder::delete('users')
    ->where('id', '=', 1);

// DELETE with multiple conditions
$builder = SQLBuilder::delete('logs')
    ->where('created_at', '<', '2023-01-01')
    ->limit(1000);

REPLACE

// REPLACE works like INSERT but replaces existing rows
$builder = SQLBuilder::replace()
    ->into('cache')
    ->values([
        'key' => 'user_123',
        'value' => 'cached_data',
        'expires_at' => '2024-12-31'
    ]);

CREATE TABLE

// Basic table creation
$builder = SQLBuilder::createTable('users')
    ->integer('id', ['AUTO_INCREMENT'])
    ->varchar('name', 100, ['NOT NULL'])
    ->varchar('email', 255, ['NOT NULL', 'UNIQUE'])
    ->text('bio')
    ->timestamps() // Adds created_at and updated_at
    ->primaryKey('id')
    ->engine('InnoDB')
    ->charset('utf8mb4');

// With foreign key
$builder = SQLBuilder::createTable('posts')
    ->integer('id', ['AUTO_INCREMENT'])
    ->integer('user_id', ['NOT NULL'])
    ->text('content')
    ->primaryKey('id')
    ->foreignKey('user_id', 'users', 'id', 'CASCADE', 'CASCADE');

CREATE INDEX

// Simple index
$sql = SQLBuilder::createIndex('idx_email')
    ->on('users')
    ->columns('email')
    ->getSQL();

// Unique index
$sql = SQLBuilder::createIndex('idx_username')
    ->on('users')
    ->columns('username')
    ->unique()
    ->getSQL();

DROP Operations

// Drop table
$sql = SQLBuilder::dropTable('old_table')->getSQL();

// Drop table if exists
$sql = SQLBuilder::dropTable('users')->ifExists()->getSQL();

// Drop index
$sql = SQLBuilder::dropIndex('idx_email', 'users')->getSQL();

// Drop database
$sql = SQLBuilder::dropDatabase('old_db')->ifExists()->getSQL();

RENAME

// Rename single table
$sql = SQLBuilder::rename('old_users', 'new_users')->getSQL();

// Rename multiple tables
$sql = SQLBuilder::rename('old_users', 'new_users')
    ->table('old_posts', 'new_posts')
    ->getSQL();

TRUNCATE

// TRUNCATE removes all rows from a table
$sql = SQLBuilder::truncate('logs')->getSQL();

SHOW Commands

// Show tables
$sql = SQLBuilder::showTables()->getSQL();

// Show databases
$sql = SQLBuilder::showDatabases()->getSQL();

// Show columns
$sql = SQLBuilder::showColumns('users')->getSQL();

// Show indexes
$sql = SQLBuilder::show()->indexes('users')->getSQL();

DESCRIBE

// Describe table structure
$sql = SQLBuilder::describe('users')->getSQL();

EXPLAIN

// Explain a query
$query = SQLBuilder::select('*')
    ->from('users')
    ->where('status', '=', 'active');

$sql = SQLBuilder::explain($query)->getSQL();

// Explain with JSON format
$sql = SQLBuilder::explain($query)->format('JSON')->getSQL();

SET

// Set session variables
$sql = SQLBuilder::set([
    'sql_mode' => 'STRICT_ALL_TABLES',
    'time_zone' => '+00:00',
    'autocommit' => 1
])->getSQL();

🔒 Security

All values are automatically bound as parameters!

// ✅ SAFE - Values are automatically bound
$builder = SQLBuilder::table('users')
    ->where('email', '=', $_POST['email'])
    ->where('age', '>', $_POST['age']);

$sql = $builder->getSQL();
// SELECT * FROM users WHERE email = :param_0 AND age > :param_1

$bindings = $builder->getBindings();
// ['param_0' => 'user@example.com', 'param_1' => 25]

🎨 Framework Integration

Laravel

use SelcukMart\SQLBuilder\Laravel\Facades\SQLBuilder;

class UserController extends Controller
{
    public function index()
    {
        $builder = SQLBuilder::table('users')
            ->select('*')
            ->where('active', '=', true);

        $users = DB::select($builder->getSQL(), $builder->getBindings());

        return view('users.index', compact('users'));
    }
}

Symfony

use SelcukMart\SQLBuilder\SQLBuilder;

class UserService
{
    public function __construct(
        private SQLBuilder $sqlBuilder,
        private Connection $connection
    ) {}

    public function getActiveUsers(): array
    {
        $builder = $this->sqlBuilder->select('*')
            ->from('users')
            ->where('status', '=', 'active');

        return $this->connection->fetchAllAssociative(
            $builder->getSQL(),
            $builder->getBindings()
        );
    }
}

🚀 Advanced Features

Subqueries

// Subquery in FROM
$subquery = SQLBuilder::select('id', 'name')
    ->from('users')
    ->where('status', '=', 'active');

$query = SQLBuilder::select('*')
    ->fromSubquery($subquery, 'active_users')
    ->where('active_users.age', '>', 18)
    ->getSQL();

Complex Queries

$builder = SQLBuilder::select('u.id', 'u.name', 'COUNT(p.id) as post_count')
    ->from('users', 'u')
    ->leftJoin('posts', 'p.user_id', '=', 'u.id', 'p')
    ->where('u.status', '=', 'active')
    ->where('u.age', '>=', 18)
    ->groupBy('u.id', 'u.name')
    ->having('COUNT(p.id)', '>', 5)
    ->orderBy('post_count', OrderDirection::DESC)
    ->limit(10);

📚 Documentation

🧪 Testing

# Run tests
composer test

# Run tests with coverage
composer test-coverage

# Run static analysis
composer phpstan

# Check code style
composer cs-check

📄 License

MIT License - see LICENSE file for details.

🙏 Credits

Created by Selcuk Mart

Made with ❤️ for the PHP community

统计信息

  • 总下载量: 11
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 0
  • 依赖项目数: 1
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2022-01-31

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固