kyanag/query

一个简单的,laravel风格的查询构造器

dev-main 2025-04-02 12:40 UTC

This package is auto-updated.

Last update: 2025-07-02 13:28:44 UTC


README

一个简答的,Laravel风格的 查询构造器 和 database 库, 支持关联模型查询

安装

composer require kyanag/query

创建

$dsn = "";
$pdo = new \PDO($dsn);

$database = \Kyanag\Query\DatabaseFactory::create($pdo);

原生查询

//查询
$records = $database->select("select * from users where id = ?", [1]);

//执行
$count = $database->exec("update users set status = ? where id = ?", [1, 2]);

//事务
$database->beginTransaction();
try{
    //do something
    $database->commit();
}catch (\Exception $e){
    $database->rollback();
}

//闭包事务
$retry = 3; //重试次数(默认不进行重试)
$database->transaction(function(){
    //do something
}, $retry)

Where子句

$query = $database->query();

//等于
$query->where("id", 1);

//比较语句
$query->where("id", ">=", 100);
$query->where("id", "<=", 100);
$query->where("id", "<>", 100);

//between
$query->whereBetween("id", [100, 200]);     //between
$query->whereNotBetween("id", [100, 200]);  //not between

//Like
$query->whereLike("name", "%张三%");  //like
$query->whereNotLike("name", "%张三%");   //not like

//Null
$query->whereNull("name");      //not null
$query->whereNotNull("name");   //not null

//WhereIn
$query->whereIn("name");      //not null
$query->whereNotIn("name");   //not null


//条件组(增加括号)
$query->where(function($query){
    return $query->where("name", $name)
        ->orWhere("nickname", $name);
});     // =>  (name = ? or nickname = ?)

//子查询
$query->whereIn("id", function() use($database){
    $database->query()->whereIn("id", function() use($database){
            //子查询
            return $database->query()
                ->table("admins")
                ->select("user_id")
                ->where("status", 1);
        })
}); // =>  `id` IN (SELECT `user_id` FROM `admins` WHERE `status` = '1')

Order 、 Group 、 Limit 、 Having

//Order By
$query->orderBy("id", "asc");
$query->orderBy("id", "desc");
$query->orderByRaw("id desc");

//Group
$query->groupBy("id", query_raw("from_unixtime(\"%Y\", created_at)"))

//Having(和Where子句类似)
$query->having("id", ">", 100)
$query->orHaving("id", ">", 200)

Select

//普通查询
/**
 * @sql SELECT `a`.*,
 *          from_unixtime(a.created_at, "%Y-%m-%d") AS create_date,
 *      `b`.`title` AS `cate_title`
 *      FROM `articles` AS `a`
 *      JOIN `categories` AS `b` ON `a`.`cate_id` = `b`.`id`
 *      WHERE `a`.`status` = '1'
 *          AND `b`.`id` IN ('1' , '2', '3')
 *          AND `a`.`created_at` BETWEEN '1704067200' AND '1735603200'
 *          AND `a`.`view_count` > '1000'
 *          AND `a`.`title` LIKE '%PHP%'
 */
$articles = $database->query()
    ->from("articles as a")
    ->join("categories as b", "a.cate_id", "b.id")
    ->select(
        "a.*",
        query_raw("from_unixtime(a.created_at, \"%Y-%m-%d\") as create_date"),
        "b.title as cate_title"
    )
    ->where("a.status", 1)
    ->whereIn("b.id", [1, 2, 3])
    ->whereBetween("a.created_at", [
        strtotime("2024-01-01"),
        strtotime("2024-12-31")
    ])
    ->where("a.view_count", ">", 1000)
    ->whereLike("a.title", "%PHP%")
    ->get();


//高级用法
/**
 * @sql SELECT * FROM `users` WHERE 
 *      `id` IN (SELECT `user_id` FROM `admins` WHERE `status` = '1') 
 *      AND 
 *      (`name` = '张三' OR `nickname` = '张三') LIMIT 1
 */
$query = $database->query()
    ->table("users")
    ->whereIn("id", function() use($database){
        //子查询
        return $database->query()
            ->table("admins")
            ->select("user_id")
            ->where("status", 1);
    })
    ->where(function($query){
        //分组
        $name = "张三";
        return $query->where("name", $name)
            ->orWhere("nickname", $name);
    })
    ->first();

Insert

/**
 * @sql INSERT INTO `articles` 
 *      (`title`, `content`, `created_at`, `view_count`) VALUES 
 *      ('小米su7发布了!', '小米su7发布了!小米su7发布了!', '1740827255', '0')
 */
$database->query()
    ->table("articles")
    ->insert([
        'title' => "小米su7发布了!",
        'content' => "小米su7发布了!小米su7发布了!",
        'created_at' => time(),
        'view_count' => 0,
    ]);

//插入(批量)
/**
* @sql INSERT INTO `articles` 
 *      (`title`, `content`, `created_at`, `view_count`) VALUES 
 *      ('小鹏G6发布了!', '小鹏G6发布了!小鹏G6发布了!', '1740827758', '0'), 
 *      ('理想L6发布了!', '理想L6发布了!', '1740827758', '0')
 */
$database->query()
    ->table("articles")
    ->insertAll([
        [
            'title' => "小鹏G6发布了!",
            'content' => "小鹏G6发布了!小鹏G6发布了!",
            'created_at' => time(),
            'view_count' => 0,
        ],
        [
            'title' => "理想L6发布了!",
            'content' => "理想L6发布了!",
            'created_at' => time(),
            'view_count' => 0,
        ]
    ]);

Update

/**
 * @sql UPDATE `articles` SET `view_count` = view_count + 1, `comment_count` = '3' WHERE `id` = '1'
 */
$database->query()
    ->table("articles")
    ->where("id", 1)
    ->update([
        'view_count' => query_raw("view_count + 1"),
        'comment_count' => 3,
    ]);

Delete

/**
 * @sql UPDATE `articles` SET `view_count` = '1' WHERE `id` = '1'
 */
$database->query()
    ->table("articles")
    ->where("id", 1)
    ->delete();

/**
 *  DELETE FROM `articles` WHERE `view_count` < '100'
 */
$database->query()
    ->table("articles")
    ->where("view_count", "<", 100)
    ->delete();

关联查询

/** @var array $users */
$users = [];    //select * from users limit 10
/**
 * 关联查询
 */
$users = $database->load($users, [
    //一对一
    'com' => $database->hasOne("com_id", "com.id"),
    //一对多
    'sub_users' => $database->hasMany("id", "users.p_id"),
    //远程一对多
    'members' => $database->belongsToMany("id", "members.id", "user_id=member_id")
    //'members' => $database->belongsToMany("id", "members.id", ['user_id', 'member_id'])
]);

/**
 * 支持的 Select 后续调用
 * @see \Kyanag\Query\QueryBuilders\SelectBuilder
 * @see \Kyanag\Query\Query\SelectQuery
 */
$users = $database->load($users, [
    //一对一
    'com' => $database->hasOne("com_id", "com.id")->where("status", 1)->orderBy("id", "desc"),
    //一对多
    'sub_users' => $database->hasMany("id", "users.p_id"),
    //远程一对多
    'members' => $database->belongsToMany("id", "members.id", "user_id=member_id")
    //'members' => $database->belongsToMany("id", "members.id", ['user_id', 'member_id'])
]);