paxha/laravel-cte

支持Laravel查询的公共表表达式(CTE)

v2.0 2019-11-16 16:12 UTC

This package is auto-updated.

Last update: 2024-09-17 03:32:33 UTC


README

Build Status Code Coverage Scrutinizer Code Quality Latest Stable Version Total Downloads License

简介

此Laravel扩展为查询构建器和Eloquent添加了对公共表表达式(CTE)的支持。

支持Laravel 5.5及以上版本。

兼容性

  • MySQL 8.0及以上
  • MariaDB 10.2及以上
  • PostgreSQL 9.4及以上
  • SQLite 3.8.3及以上
  • SQL Server 2008及以上

安装

composer require paxha/laravel-cte:"^1.0"

使用方法

SELECT查询

使用withExpression()并提供查询构建器实例、SQL字符串或闭包

$posts = DB::table('p')
    ->select('p.*', 'u.name')
    ->withExpression('p', DB::table('posts'))
    ->withExpression('u', function ($query) {
        $query->from('users');
    })
    ->join('u', 'u.id', '=', 'p.user_id')
    ->get();

使用withRecursiveExpression()进行递归表达式

$query = DB::table('users')
    ->whereNull('parent_id')
    ->unionAll(
        DB::table('users')
            ->select('users.*')
            ->join('tree', 'tree.id', '=', 'users.parent_id')
    );

$tree = DB::table('tree')
    ->withRecursiveExpression('tree', $query)
    ->get();

您可以提供表达式的列作为第三个参数

$query = 'select 1 union all select number + 1 from numbers where number < 10';

$numbers = DB::table('numbers')
    ->withRecursiveExpression('numbers', $query, ['number'])
    ->get();

INSERT/UPDATE/DELETE查询

您可以在INSERT(Laravel 5.7.17及以上)、UPDATEDELETE查询中使用公共表表达式

DB::table('profiles')
    ->withExpression('u', DB::table('users')->select('id', 'name'))
    ->insertUsing(['user_id', 'name'], DB::table('u'));
DB::table('profiles')
    ->withExpression('u', DB::table('users'))
    ->join('u', 'u.id', '=', 'profiles.user_id')
    ->update(['profiles.name' => DB::raw('u.name')]);
DB::table('profiles')
    ->withExpression('u', DB::table('users')->where('active', false))
    ->whereIn('user_id', DB::table('u')->select('id'))
    ->delete();

Eloquent

您可以在Eloquent查询中使用公共表表达式。

在Laravel 5.5–5.7中,这需要QueriesExpressions特性

class User extends Model
{
    use \Paxha\LaravelCte\Eloquent\QueriesExpressions;
}

$query = User::whereNull('parent_id')
    ->unionAll(
        User::select('users.*')
            ->join('tree', 'tree.id', '=', 'users.parent_id')
    );

$tree = User::from('tree')
    ->withRecursiveExpression('tree', $query)
    ->get();

递归关系

如果您想实现递归关系,可以使用此包:paxha/laravel-adjacency-list

Lumen

如果您使用Lumen,您必须手动实例化查询构建器

$builder = new \Paxha\LaravelCte\Query\Builder(app('db')->connection());

$result = $builder->from(...)->withExpression(...)->get();

在Eloquent中,所有Lumen版本都需要QueriesExpressions特性。

贡献

请参阅CONTRIBUTING行为准则以获取详细信息。