paxha/laravel-cte
支持Laravel查询的公共表表达式(CTE)
v2.0
2019-11-16 16:12 UTC
Requires
- php: ^7.2
- illuminate/database: ^6.0
Requires (Dev)
- laravel/homestead: ^9.0
- orchestra/testbench: ^4.0
README
简介
此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及以上)、UPDATE
和DELETE
查询中使用公共表表达式
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和行为准则以获取详细信息。