laravel中的sql语句集锦

本文介绍了Laravel框架中常见的SQL操作方法,包括数据的增删改查、连接查询、请求处理、路由设置等,并提供了聚合操作及高级查询技巧。
一.laravel中的sql语句集锦
1.插入数据
(1) DB::table('user')->insert($data);
(2)插入数据同时返回自增id
DB::table('user')->insertGetId($data);
2.修改
DB::table('user')->where('id',1)->update($data);
3.删除
DB::table('user')->where('id',1)->delete();
4.查找一条数据
  $res = AdminuserModel::where('id',$id)->first();
  $res = AdminuserModel::find($id);//查询id=1的数据
  $pay_data=Db::table('config')->find(1);
5.获取所有数据
  PriceModel::get();获取price表中所有数据
6.where  or .Where Between;Where Not Between
(1)where
 $users = DB::table('users')->where('votes', '>', 100)->get();
(2)or
$users = DB::table('users')->where('votes', '>', 100)->orWhere('name', 'John')->get();
(3)Where Between
$users = DB::table('users')->whereBetween('votes', array(1, 100))->get();
(4)Where Not Between
$users = DB::table('users')->whereNotBetween('votes', array(1, 100))->get();
(5)Where In
$users = DB::table('users')->whereIn('id', array(1, 2, 3))->get();
$users = DB::table('users')->whereNotIn('id', array(1, 2, 3))->get();
(6)Order By, Group By, And Having
$users = DB::table('users')->orderBy('name', 'desc')->groupBy('count')->having('count', '>', 100)->get();
(7)Offset & Limit
$users = DB::table('users')->offset($offset)->limit(10)->get();
二、连接
Joins

查询构建器也可以用来编写连接语句。看看下面的例子:

Basic Join Statement

复制代码代码如下:

DB::table('users')
  ->join('contacts', 'users.id', '=', 'contacts.user_id')
  ->join('orders', 'users.id', '=', 'orders.user_id')
  ->select('users.id', 'contacts.phone', 'orders.price')
  ->get();
左连接语句

复制代码代码如下:

DB::table('users')
  ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
  ->get();
  DB::table('users')
  ->join('contacts', function($join)
  {
  $join->on('users.id', '=', 'contacts.user_id')->orOn(...);
  })
  ->get();
  DB::table('users')
  ->join('contacts', function($join)
  {
  $join->on('users.id', '=', 'contacts.user_id')
  ->where('contacts.user_id', '>', 5);
  })
  ->get();
三、request相关用法
    1.取到单个值  $request->name;同 $request->input('name');

    $request->input('name', 'Linda'); 没有获取到用默认值

    2.取到所有值  $request->all();

    3.只取哪些值  $request->only(['age','name']);

    4.取出除了这些键的值 $request->except('name');
四、路由
  //后台登录和退出
  Route::any('/login','AdminController@login')->name('login');
  Route::any('/loginout','AdminController@loginout')->name('loginout');
  Route::group(['middleware' => ['login']], function () {//后台登录中间件
  Route::any('/', 'AdminController@index')->name('index');
  //用户管理
  Route::any('/admin/user/index','AdminuserController@index');
  });
  // 匹配[]里面的路由信息
  Route::match(['get', 'post','put'], '/getPost', function () {
      return 'Hello World';
  });
  //匹配任何一个
  Route::any('foo', function () {
      return 'Hello World1';
  });
五、分组
  有时候,您可能需要创建更高级的where子句,如“存在”或嵌套参数分组。Laravel query builder可以处理这些:
复制代码代码如下:
DB::table('users')
->where('name', '=', 'John')
->orWhere(function($query)
{
$query->where('votes', '>', 100)
->where('title', '<>', 'Admin');
})
->get();

  上面的查询将产生以下SQL:
复制代码代码如下:

  select * from users where name = 'John' or (votes > 100 and title
<> 'Admin')
  Exists Statements
  DB::table('users')
  ->whereExists(function($query)
  {
  $query->select(DB::raw(1))
  ->from('orders')
  ->whereRaw('orders.user_id = users.id');
  })
  ->get();
上面的查询将产生以下SQL:

复制代码代码如下:

select * from userswhere exists (
select 1 from orders where orders.user_id = users.id
)
六、聚合

查询构建器还提供了各种聚合方法,如统计,马克斯,min,avg和总和。

Using Aggregate Methods

复制代码代码如下:

$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');
$price = DB::table('orders')->min('price');
$price = DB::table('orders')->avg('price');
$total = DB::table('users')->sum('votes');
Raw Expressions

有时您可能需要使用一个原始表达式的查询。这些表达式将注入的查询字符串,所以小心不要创建任何SQL注入点!创建一个原始表达式,可以使用DB:rawmethod:

Using A Raw Expression

复制代码代码如下:

$users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();
递增或递减一个列的值

复制代码代码如下:

DB::table('users')->increment('votes');
DB::table('users')->increment('votes', 5);
DB::table('users')->decrement('votes');
DB::table('users')->decrement('votes', 5);


<think>我们参考了用户提供的多个引用,这些引用主要介绍了在Laravel框架中记录或输出SQL语句的不同方法。用户的问题集中在“如何输出SQL语句”,因此我们需要综合这些方法,给出清晰的步骤和说明。 根据引用内容,我们可以归纳出以下几种方法: 1. 使用Laravel自带的`dd()`或`dump()`方法(引用[2]提到)。 2. 使用事件监听(引用[1]和引用[5]提到,通过监听查询事件并记录)。 3. 使用日志记录(引用[3]提到,将SQL语句打印到日志)。 4. 使用第三方扩展包(如引用[1]提到的`laravelsql`扩展)。 由于用户要求输出SQL语句,我们重点介绍几种常用方法,并给出具体步骤。 ### 方法1:使用`dd()`或`dump()`方法 在查询构造器链式调用末尾使用`dd()`(打印并终止执行)或`dump()`(打印不终止)可以输出SQL语句和绑定参数。 ```php // 使用dd()输出并终止 User::where(&#39;id&#39;, 1)->dd(); // 使用dump()输出不终止 User::where(&#39;id&#39;, 1)->dump(); ``` 输出结果会包含完整的SQL语句(已经替换了绑定参数)以及执行时间等信息[^2]。 ### 方法2:监听查询事件 在Laravel中,每次数据库查询都会触发`QueryExecuted`事件。我们可以通过创建一个事件监听器来记录SQL语句。 **步骤:** 1. 创建监听器: ```bash php artisan make:listener QueryListener --event=Illuminate\\Database\\Events\\QueryExecuted ``` 2. 在生成的监听器文件`app/Listeners/QueryListener.php`中编写逻辑: ```php <?php namespace App\Listeners; use Illuminate\Database\Events\QueryExecuted; use Illuminate\Support\Facades\Log; class QueryListener { public function handle(QueryExecuted $event) { // 获取SQL语句和绑定参数 $sql = $event->sql; $bindings = $event->bindings; $time = $event->time; // 将绑定参数替换到SQL语句中 $sql = vsprintf(str_replace(&#39;?&#39;, "&#39;%s&#39;", $sql), $bindings); // 输出到日志 Log::info("[SQL] {$sql} | Time: {$time}ms"); } } ``` 3. 注册事件监听:在`app/Providers/EventServiceProvider.php`中: ```php protected $listen = [ \Illuminate\Database\Events\QueryExecuted::class => [ \App\Listeners\QueryListener::class, ], ]; ``` 这样,每次执行SQL语句都会记录到日志文件中(默认在`storage/logs`目录下)[^5]。 ### 方法3:使用第三方扩展包 引用[1]提到使用`laravelsql`扩展包。安装后可以方便地输出完整SQL。 1. 安装扩展包: ```bash composer require rap2hpoutre/laravel-log-viewer ``` 注意:这里引用[1]提到的扩展包名称可能是错误的,实际上常用的扩展包是`barryvdh/laravel-debugbar`或`rap2hpoutre/laravel-log-viewer`?但根据引用[1]描述,可能是`laravelsql`,但实际搜索可能没有这个包,所以这里可能需要更正。不过,更常用的是`barryvdh/laravel-debugbar`,它可以显示所有查询。 以`barryvdh/laravel-debugbar`为例: ```bash composer require barryvdh/laravel-debugbar --dev ``` 安装后,在开发环境中会自动在页面底部显示一个调试栏,其中包含执行的SQL语句。 ### 方法4:直接获取查询SQL 对于单个查询,可以直接使用`toSql()`方法获取未替换绑定参数的SQL语句: ```php $query = User::where(&#39;id&#39;, 1); $sql = $query->toSql(); $bindings = $query->getBindings(); // 手动替换绑定参数 $sql = vsprintf(str_replace(&#39;?&#39;, "&#39;%s&#39;", $sql), $bindings); echo $sql; ``` ### 总结 根据不同的场景,可以选择不同的方法: - 快速调试单个查询:使用`dd()`或`dump()`。 - 记录所有SQL到日志:使用事件监听。 - 开发阶段实时查看SQL:使用Debugbar扩展包。 以上方法在Laravel框架中都是常用的输出SQL语句的方式[^1][^2][^3][^5]。 §§相关问题§§ 1. Laravel中如何将SQL语句记录到文件而不是页面输出? 2. 如何在Laravel中优化慢查询? 3. 如何配置Laravel的日志系统以按日期分割日志文件? </think>在 Laravel 框架中输出 SQL 语句有以下几种常用方法,结合引用内容为您整理: --- ### 一、直接调试方法(适合快速查看) 1. **使用 `dd()` 或 `dump()`** 在查询构造器后调用内置方法,输出完整 SQL 和结果: ```php // 输出 SQL 并终止执行(dd = dump and die) User::where(&#39;id&#39;, 1)->dd(); // 输出 SQL 不终止执行 User::where(&#39;id&#39;, 1)->dump(); ``` **效果**:直接显示绑定了参数的完整 SQL(如 `SELECT * FROM users WHERE id = 1`)[^2]。 2. **使用 `toSql()` 获取未绑定参数的 SQL** ```php $sql = User::where(&#39;id&#39;, 1)->toSql(); dd($sql); // 输出:select * from `users` where `id` = ? ``` > ✅ 需手动替换参数占位符 `?`[^3]。 --- ### 二、全局记录 SQL(适合长期调试) 1. **通过事件监听记录到日志** **步骤**: ```php // 步骤1: 创建监听器 php artisan make:listener QueryListener --event=QueryExecuted // 步骤2: 在 app/Listeners/QueryListener.php 中编写逻辑 public function handle(QueryExecuted $event) { $sql = vsprintf( str_replace(&#39;?&#39;, "&#39;%s&#39;", $event->sql), $event->bindings ); Log::channel(&#39;sql&#39;)->debug("SQL: {$sql} | Time: {$event->time}ms"); } // 步骤3: 在 app/Providers/EventServiceProvider.php 注册事件 protected $listen = [ &#39;Illuminate\Database\Events\QueryExecuted&#39; => [ &#39;App\Listeners\QueryListener&#39; ] ]; ``` **效果**:所有 SQL 会记录到 `storage/logs/sql.log`[^1][^5]。 2. **简化版中间件记录** 在 `App\Http\Middleware` 中创建中间件: ```php public function handle($request, Closure $next) { DB::listen(function ($query) { Log::debug("SQL: " . $query->sql, $query->bindings); }); return $next($request); } ``` --- ### 三、使用扩展包(推荐) 安装 **Laravel Debugbar** 或 **Laravel SQL Monitor**: ```bash composer require barryvdh/laravel-debugbar --dev ``` **效果**:页面底部自动显示所有执行的 SQL、耗时及调用位置[^1]。 --- ### 四、复杂场景处理 ```php // 示例:复杂查询输出(引用[4]) $query = DB::table(&#39;a&#39;) ->leftJoin(&#39;b&#39;, &#39;a.x&#39;, &#39;=&#39;, &#39;b.y&#39;) ->where(&#39;col&#39;, 0) ->where(&#39;col1&#39;, 1) ->where(function ($q) { $q->where(&#39;col2&#39;, 2)->orWhere(&#39;col3&#39;, 3); }) ->dd(); // 直接输出完整 SQL ``` --- ### 💡 关键区别总结 | **方法** | 适用场景 | 是否显示参数 | 是否记录时间 | |-------------------|----------------|-------------|------------| | `dd()`/`dump()` | 单次调试 | ✅ 是 | ✅ 是 | | 事件监听日志 | 全局监控 | ✅ 是 | ✅ 是 | | `toSql()` | 获取原始 SQL 结构| ❌ 否 | ❌ 否 | | Debugbar 扩展 | 开发环境集成 | ✅ 是 | ✅ 是 | > 建议:开发调试用 Debugbar 扩展,生产环境排查用事件监听日志[^1][^3][^5]。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值