威尼斯wns.9778官网 > 计算机教程 > Laravel  威尼斯wns.9778官网:Database: 数据库操作

原标题:Laravel  威尼斯wns.9778官网:Database: 数据库操作

浏览次数:152 时间:2019-09-27

1、连接查询(join)

Laravel Database: Query Builder

连接查询指的是将两张表或多张表关联到一起进行查询,获取一个表的行与另一个表的行匹配的数据。常见的连接查询包括内连接(等值连接)、左(外)连接、右(外)连接和交叉连接(完全连接)等。下面这张图形象的展示了这几种连接查询所获取的结果集:

Laravel 提供丰富好用的的数据库操作接口,使用了 PDO 参数绑定,避免出现 SQL 注入攻击。
当传送的数据作为绑定时,根本就不需要对数据进行过滤。

SQL连接查询

查询

下面我们简单演示下内连接和左连接。我们将用户表users和文章表posts关联到一起进行查询,在此之前,我们先创建posts表,其字段及初始值如下:

查询一张表的所有记录

文章表posts

你可以使用 DB facade 的 method 方法来查询,table 方法返回的是指定表的实际,允许你进行更多的链式操作,最后使用 get 方法来取得结果。

其中user_id对应users表中的用户id。

<?php

namespace AppHttpControllers;

use IlluminateSupportFacadesDB;
use AppHttpControllersController;

class UserController extends Controller
{
/**

  • Show a list of all of the application's users.
    • @return Response
      */
      public function index()
      {
      $users = DB::table('users')->get();

      return view('user.index', ['users' => $users]);

}
}

1.1 内连接

get 方法返回一个 IlluminateSupportCollection,结果集中包含的每一条记录都是 PHP 标准类的实例。
你可以通过访问对象属性的方式,来访问每一列的值。

内连接用于获取两张表结果集的交集部分,我们可以使用查询构建器的join方法进行内连接查询:

foreach ($users as $user) {
echo $user->name;
}

$users = DB::table('users')->join('posts','users.id','=','posts.user_id')->get();
dd($users);

从一张表中获取一条记录或列

1.2 左连接

first 方法就可以实现,返回的结果是一个 StdClass 对象

左连接的结果集指定的左表的所有行,如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。我们使用查询构建器的leftJoin方法进行左连接查询:

$user = DB::table('users')->where('name', 'John')->first();

echo $user->name;

$users = DB::table('users')->leftJoin('posts','users.id','=','posts.user_id')->get();
dd($users);

如果你不需要整条记录,只需要提取某条记录中的单个值,使用 value 方法,返回结果就是列的值。

对应的输出结果为:

$email = DB::table('users')->where('name', 'John')->value('email');

left join 查询结果

获取所有记录中某列的所有值

1.3 更加复杂的连接查询

使用 pluck 方法就可以获取到所有单列值的数组

很多时候,连接查询的查询条件往往更为复杂,并不是一个简单的join/leftJoin方法就能搞定的,那么我们如何添加更加复杂的查询条件呢?使用JoinClause代替条件参数:

$titles = DB::table('roles')->pluck('title');

foreach ($titles as $title) {
echo $title;
}

$users = DB::table('users')->join('posts',function($join){
    $join->on('users.id','=','posts.user_id')
         ->where('posts.id','>',1);
})->get();
dd($users);

为返回数组指定一个自定义键值列

 

$roles = DB::table('roles')->pluck('title', 'name');

foreach ($roles as $name => $title) {
echo $title;
}

2、联合查询(union)

对大数据进行分片处理

联合查询用于将两个或更多查询的结果集组合为单个结果集,该结果集包含联合查询中所有查询的全部行。UNION的结果集列名与UNION运算符中第一个Select语句的结果集的列名相同,另一个Select语句的结果集列名将被忽略,且其他查询字段数必须和第一个相同。Laravel查询构建器中我们使用union方法进行联合查询:

如果你需要处理数千条数据,可以考虑使用 chunk 方法。
威尼斯wns.9778官网,该方法可以提取部分数据,并可以再 Closure 中对这些数据进行处理。
特别适合用于 Artisan command 来处理大量的数据记录。

$users = DB::table('users')->where('id','<',3);
$users = DB::table('users')->where('id','>',2)->union($users)->get();
dd($users);

DB::table('users')->orderBy('id')->chunk(100, function($users) {
foreach ($users as $user) {
//
}
});

3、where子句

你还可以通过,闭包中返回 false 来中断数据分片处理的执行。

使用查询构建器上的where方法可以添加自定义查询条件,调用该方法需要传入三个参数:第一个列名,第二个是操作符,第三个是比较值:

DB::table('users')->orderBy('id')->chunk(100, function($users) {
// Process the records...

return false;
});

$user = DB::table('users')->where('name','=','Laravel')->get();
dd($user);

聚合计算

如果操作符为“=”,该语句也可简化为:

聚合计算方法,有 count, max, min, avg 与 sum 。

$user = DB::table('users')->where('name','Laravel')->get();

你可以直接在查询后使用这些方法:

 

users = DB::table('users')->count();

$price = DB::table('orders')->max('price');

需要注意的是查询构建器支持方法链,这意味着如果有多个查询条件且这个多个条件是AND连接,可以在get之前使用多个where方法。如果多个条件使用OR连接,可以使用orWhere方法:

还可以结合其他的条件进行使用:

$user = DB::table('users')->where('name','Laravel')->orWhere('name','Academy')->get();

$price = DB::table('orders')
->where('finalized', 1)
->avg('price');

更多where子句查询条件可查看IlluminateDatabaseQueryBuilder源码。

Selects

本文由威尼斯wns.9778官网发布于计算机教程,转载请注明出处:Laravel  威尼斯wns.9778官网:Database: 数据库操作

关键词:

上一篇:PHP 7: PHP 变量和常量的定义

下一篇:没有了