laravel安装
通过composer安装
如果你的终端已经安装了 PHP 和 Composer,你可以直接使用 Composer 来创建一个新的 Laravel 项目。 当应用程序创建完成后,你可以通过 Artisan CLI 的 serve 命令来启动 Laravel 的本地服务:
composer create-project laravel/laravel example-app
cd example-app
php artisan serve
目录结构
根目录
App 目录
app 目录包含应用程序的核心代码。 我们将很快更详细地探索这个目录; 但是,您应用程序中的几乎所有类都将在此目录中。
Bootstrap 目录
bootstrap 目录包含启动框架的 app.php 文件。 该目录还包含一个「cache」目录,其中包含用于性能优化的框架生成文件,例如路由和服务缓存文件。 您通常不需要修改此目录中的任何文件。
Config 目录
顾名思义,config 目录包含应用程序的所有配置文件。最好把这些文件都浏览一遍,并熟悉所有可用的选项。
Database 目录
database 目录包含数据库迁移,模型工厂和种子生成器文件。如果你愿意,你还可以把它作为 SQLite 数据库存放目录。
Lang 目录
lang 目录包含应用程序的所有语言文件。
Public 目录
public 目录包含 index.php 文件,该文件是进入你应用程序的所有请求的入口,并配置自动加载。该目录还包含你的资源,如图像、JavaScript 脚本和 CSS 样式。
Resources 目录
resources 目录包含了 views 以及未编译的资源文件(如 CSS 或 JavaScript)。此目录还包含所有的语言文件。
Routes 目录
routes 目录包含应用程序的所有路由定义。默认情况下,Laravel 包含几个路由文件: web.php,api.php,console.php 以及 channels.php。
web.php 文件包含 RouteServiceProvider 放置在 web 中间件组中的路由,该中间件组提供会话状态,CSRF 保护和 cookie 加密,如果你的应用程序不提供无状态的 RESTful API,那么你的所有路由都很可能在 web.php 文件。
api.php 文件包含 RouteServiceProvider 放置在 api 中间件组中的路由。 这些路由旨在是无状态的,因此通过这些路由进入应用程序的请求旨在 [通过令牌](/docs/laravel/9.x/sanctum)进行身份验证,并且无法访问会话状态。
console.php 文件是您可以定义所有基于闭包的控制台命令的地方。 每个闭包都绑定到一个命令实例,允许一种简单的方法与每个命令的 IO 方法进行交互。 即使此文件没有定义 HTTP 路由,它也会定义应用程序中基于控制台的入口点(路由)。
channels.php 文件是您可以注册应用程序支持的所有 事件广播 频道的地方。
Storage 目录
storage 目录包含你的日志、编译的 Blade 模板、基于文件的会话、文件缓存和框架生成的其他文件。 该目录分为 app、framework 和 logs 目录。 app 目录可用于存储应用程序生成的任何文件。framework 目录用于存储框架生成的文件和缓存。 最后,logs 目录包含应用程序的日志文件。
storage/app/public 目录可用于存储用户生成的文件,例如个人资料头像,这些文件应该可以公开访问。 你应该在 public/storage 创建一个指向这个目录的符号链接。 您可以使用 php artisan storage:link Artisan 命令创建链接。
Tests 目录
tests 目录包含您的自动化测试。 开箱即用的示例 PHPUnit 单元测试和功能测试。 每个测试类都应以单词「Test」作为后缀。 您可以使用 phpunit 或 php vendor/bin/phpunit 命令运行测试。 或者,如果您想要更详细和更漂亮的测试结果表示,您可以使用 php artisan test Artisan 命令运行测试。
Vendor 目录
vendor 目录包含您的 Composer 依赖项。
App 目录
您的大部分应用程序都位于 app 目录中。默认情况下,此目录在 App 下命名,并由 Composer 使用 [PSR-4 自动加载标准] (www.php-fig.org/psr/psr-4/) 自动加载。
app 目录包含各种附加目录,例如 Console、Http 和 Providers。将 Console 和 Http 目录视为为应用程序核心提供 API。 HTTP 协议和 CLI 都是与应用程序交互的机制,但实际上并不包含应用程序逻辑。换句话说,它们是向您的应用程序发出命令的两种方式。 Console 目录包含您的所有 Artisan 命令,而 Http 目录包含您的控制器、中间件和请求。
当您使用 make Artisan 命令生成类时,会在 app 目录中生成各种其他目录。因此,例如,在您执行 make:job Artisan 命令生成作业类之前,app/Jobs 目录将不存在。
技巧:app 目录中的许多类可以由 Artisan 通过命令生成。 要查看可用命令,请在终端中运行 php artisan list make 命令。
Broadcasting 目录
Broadcasting 目录包含应用程序的所有广播频道类。 这些类是使用 make:channel 命令生成的。 此目录默认不存在,但会在您创建第一个频道时为您创建。 要了解有关频道的更多信息,请查看有关 事件广播 的文档。
Console 目录
Console 目录包含应用程序的所有自定义 Artisan 命令。 这些命令可以使用 make:command 命令生成。 该目录还包含您的控制台内核,这是您注册自定义 Artisan 命令和定义 计划任务 的地方。
Exceptions 目录
Exceptions 目录包含应用程序的异常处理程序,也是放置应用程序抛出的任何异常的好地方。 如果您想自定义记录或呈现异常的方式,您应该修改此目录中的 Handler 类。
Http 目录
Http 目录包含您的控制器、中间件和表单请求。 几乎所有处理进入应用程序的请求的逻辑都将放在这个目录中。
Models 目录
Models 目录包含所有 Eloquent 模型类。 Laravel 中包含的 Eloquent ORM 提供了一个漂亮、简单的 ActiveRecord 实现来处理你的数据库。 每个数据库表都有一个相应的「模型」,用于与该表进行交互。 模型允许您查询表中的数据,以及将新记录插入表中。
Providers 目录
Providers 目录包含程序中所有的 服务提供者 。服务提供者通过在服务容器中绑定服务、注册事件或执行任何其他任务来引导应用程序以应对传入请求。
在一个新的 Laravel 应用程序中,这个目录已经包含了几个提供者。您可以根据需要将自己的提供程序添加到此目录。
路由
基本路由
最基本的 Laravel 路由接受一个 URI 和一个闭包,提供了一个简单优雅的方法来定义路由和行为,而不需要复杂的路由配置文件:
use Illuminate\Support\Facades\Route;
Route::get('/greeting', function () {
return 'Hello World';
});
use App\Http\Controllers\UserController;
Route::get('/user', [UserController::class, 'index']);
定义在 routes/api.php 文件中的路由是被 RouteServiceProvider 嵌套在一个路由组内。 在这个路由组内,将自动应用 /api URI 前缀,所以你无需手动将其应用于文件中的每个路由。你可以通过修改 RouteServiceProvider 类来修改前缀和其他路由组选项。
可用的路由方法
路由器允许你注册能响应任何 HTTP 请求的路由:
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
有的时候你可能需要注册一个可响应多个 HTTP 请求的路由,这时你可以使用 match 方法,也可以使用 any 方法注册一个实现响应所有 HTTP 请求的路由:
Route::match(['get', 'post'], '/', function () {
//
});
Route::any('/', function () {
//
});
依赖注入
你可以在路由的回调方法中,以形参的方式声明路由所需要的任何依赖项。这些依赖会被 Laravel 的 容器 自动解析并注入。 例如,你可以在闭包中声明 Illuminate\Http\Request 类,让当前的 HTTP 请求自动注入依赖到你的路由回调中:
use Illuminate\Http\Request;
Route::get('/users', function (Request $request) {
// ...
});
路由参数
必填参数
有时你将需要捕获路由内的 URI 段。例如,你可能需要从 URL 中捕获用户的 ID。你可以通过定义路由参数来做到这一点:
Route::get('/user/{id}', function ($id) {
return 'User '.$id;
});
也可以根据你的需要在路由中定义多个参数:
Route::get('/posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
路由的参数通常都会被放在 {} ,并且参数名只能为字母。下划线 (_) 也可以用于路由参数名中。路由参数会按路由定义的顺序依次注入到路由回调或者控制器中,而不受回调或者控制器的参数名称的影响。
可选参数
有时,你可能需要指定一个路由参数,但你希望这个参数是可选的。你可以在参数后面加上 ? 标记来实现,但前提是要确保路由的相应变量有默认值:
Route::get('/user/{name?}', function ($name = null) {
return $name;
});
Route::get('/user/{name?}', function ($name = 'John') {
return $name;
});
正则表达式约束
你可以使用路由实例上的 where 方法来限制路由参数的格式。 where 方法接受参数的名称和定义如何约束参数的正则表达式:
Route::get('/user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+');
Route::get('/user/{id}', function ($id) {
//
})->where('id', '[0-9]+');
Route::get('/user/{id}/{name}', function ($id, $name) {
//
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
路由前缀
prefix 方法可以用给定的 URI 为组中的每个路由做前缀。例如,你可能想要在组内的所有路由 uri 前面加上 admin 前缀:
Route::prefix('admin')->group(function () {
Route::get('/users', function () {
// Matches The "/admin/users" URL
});
});
中间件
中间件提供了一种方便的机制来检查和过滤进入应用程序的 HTTP 请求。除了身份验证之外,还可以编写其他中间件来执行各种任务。中间件都位于 app/Http/Middleware 目录中。
定义中间件
要创建新的中间件,请使用 make:middleware Artisan 命令:
php artisan make:middleware EnsureTokenIsValid
此命令将在您的 app/Http/Middleware 目录中放置一个新的 EnsureTokenIsValid 类。在这个中间件中,如果提供的 token 输入匹配指定的值,我们将只允许访问路由。否则,我们会将用户重定向回 home URI:
<?php
namespace App\Http\Middleware;
use Closure;
class EnsureTokenIsValid
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->input('token') !== 'my-secret-token') {
return redirect('home');
}
return $next($request);
}
}
如您所见,如果给定的 token 与我们的秘密令牌不匹配,中间件将向客户端返回 HTTP 重定向; 否则,请求将被进一步传递到应用程序中。要将请求更深入地传递到应用程序中(允许中间件「通过」),您应该使用 next 回调。
最好将中间件设想为一系列「层」HTTP 请求在到达您的应用程序之前必须通过。每一层都可以检查请求,甚至完全拒绝它。
注册中间件
全局中间件#
如果您希望在对应用程序的每个 HTTP 请求期间运行中间件,请在 app/Http/Kernel.php 类的 $middleware 属性中列出中间件类。
将中间件分配给路由
如果您想将中间件分配给特定的路由,您应该首先在应用程序的 app/Http/Kernel.php 文件中为中间件分配一个键。默认情况下,该类的 $routeMiddleware 属性包含 Laravel 中包含的中间件的条目。 您可以将自己的中间件添加到此列表中,并为其分配您选择的键:
// 在 App\Http\Kernel 类中...
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
将中间件分配给路由
Route::get('/profile', function () {
//
})->middleware('auth');
为路由分配多个中间件
Route::get('/', function () {
//
})->middleware(['first', 'second']);
配置数据库
在.env文件里面配置数据库的信息
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_lover
DB_USERNAME=root
DB_PASSWORD=root
数据库迁移
使用 make:migration Artisan command 生成数据库迁移。新的迁移将放在您的 database/migrations 目录每个迁移文件名都包含一个时间戳,允许 Laravel 确定迁移的顺序:
php artisan make:migration create_flights_table
迁移结构
迁移类包含两个方法:up 和 down 。up 方法用于向数据库中添加新表、列或索引,而 down 方法用于撤销 up 方法执行的操作。.
在这两种方法中,可以使用 Laravel 模式构建器来富有表现力地创建和修改表。要了解 Schema 构建器上可用的所有方法,查看其文档。例如,以下迁移会创建一个 flights 表:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('flights', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('airline');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('flights');
}
};
执行迁移
执行 Artisan 命令 migrate,来运行所有未执行过的迁移:
php artisan migrate
如果你想查看目前已经执行了哪些迁移,可以使用 migrate:status Artisan 命令:
php artisan migrate:status
回滚迁移 如果要回滚最后一次迁移操作,可以使用 Artisan 命令 rollback。该命令会回滚最后「一批」的迁移,这可能包含多个迁移文件:
php artisan migrate:rollback
命令 migrate:reset 会回滚应用已运行过的所有迁移:
php artisan migrate:reset
删除所有表然后执行迁移
命令 migrate:fresh 会删去数据库中的所有表,随后执行命令 migrate:
php artisan migrate:fresh
php artisan migrate:fresh --seed
创建数据表
接下来我们将使用 Schema 的 create 方法创建一个新的数据表。create 接受两个参数:第一个参数是表名,而第二个参数是一个闭包,该闭包接受一个用来定义新数据表的 Blueprint 对象:
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email');
$table->timestamps();
});
数据填充
Laravel 内置了一个可为你的数据库填充测试数据的填充类。所有的填充类都放在 database/seeds 目录下。Laravel 默认定义了一个 DatabaseSeeder 类。通过这个类,你可以用 call 方法来运行其他的 seed 类,从而控制数据填充的顺序。
运行 Artisan 命令 make:seeder 可以生成 Seeder,框架生成的 seeders 都放在 database/seeders 目录下:
php artisan make:seeder UserSeeder
Seeder 类只包含一个默认方法:run。这个方法会在执行 db:seed 这个 Artisan command 时被调用。在 run 方法里,你可以按需在数据库中插入数据。你也可以用 构造查询器 或 Eloquent 模型工厂 来手动插入数据。
如下所示,在默认的 DatabaseSeeder 类中的 run 方法中添加一条数据插入语句:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
class DatabaseSeeder extends Seeder
{
/**
* 执行数据填充
*
* @return void
*/
public function run()
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@gmail.com',
'password' => Hash::make('password'),
]);
}
}
使用模型工厂
当然,手动为每个模型填充指定属性很麻烦,你可以使用 模型工厂 轻松地生成大量数据库数据。首先,阅读 模型工厂文档 来学习如何定义工厂文件。
例如,创建 50 个用户并为每个用户创建关联:
use App\Models\User;
/**
* 执行数据填充
*
* @return void
*/
public function run()
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}
运行 Seeders
你可以使用 Artisan 命令 db:seed 来填充数据库。默认情况下, db:seed 命令将运行 Database\Seeders\DatabaseSeeder 类,这个类又可以调用其他 seed 类。不过,你也可以使用 --class 选项来指定一个特定的 seeder 类:
php artisan db:seed
php artisan db:seed --class=UserSeeder
你还可以使用 migrate:fresh 命令结合 --seed 选项,这将删除数据库中所有表并重新运行所有迁移。此命令对于完全重建数据库非常有用:
php artisan migrate:fresh --seed
控制器
控制器可以将相关的请求处理逻辑分组到一个类中。 例如,一个 UserController 类可能会处理所有与用户相关的传入请求,包括显示、创建、更新和删除用户。 默认情况下,控制器存储在 app/Http/Controllers 目录中
编写控制器
生成控制器
php artisan make:controller ControllerName
基本控制器
让我们看一个基本控制器的例子。 请注意,控制器扩展了 Laravel 中包含的基本控制器类 App\Http\Controllers\Controller:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Models\User;
class UserController extends Controller
{
/**
* 显示给定用户的个人资料。
*
* @param int $id
* @return \Illuminate\View\View
*/
public function show($id)
{
return view('user.profile', [
'user' => User::findOrFail($id)
]);
}
}
可以像这样定义此控制器方法的路由:
use App\Http\Controllers\UserController;
Route::get('/user/{id}', [UserController::class, 'show']);
单动作控制器
如果控制器动作特别复杂,您可能会发现将整个控制器类专用于该单个动作很方便。为此,您可以在控制器中定义一个 __invoke 方法:、
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Models\User;
class ProvisionServer extends Controller
{
/**
* 配置新的 Web 服务器。
*
* @return \Illuminate\Http\Response
*/
public function __invoke()
{
// ...
}
}
为单动作控制器注册路由时,不需要指定控制器方法。相反,您可以简单地将控制器的名称传递给路由器:
use App\Http\Controllers\ProvisionServer;
Route::post('/server', ProvisionServer::class);
可以使用 make:controller Artisan 命令的 --invokable 选项生成可调用控制器:
php artisan make:controller ProvisionServer --invokable
会话
简介
由于 HTTP 驱动的应用程序是无状态的,Session 提供了一种在多个请求之间存储有关用户信息的方法,这类信息一般都存储在后续请求可以访问的持久存储 / 后端中。
配置
Session 的配置文件存储在 config/session.php 文件中。请务必查看此文件中对于你而言可用的选项。默认情况下,Laravel 为绝大多数应用程序配置的 Session 驱动为 file 驱动,它适用于大多数程序。
使用 Session
获取数据
在 Laravel 中有两种基本的 Session 使用方式:全局 session 助手函数和通过 Request 实例。首先看下通过 Request 实例访问 Session , 它可以隐式绑定路由闭包或者控制器方法。记住,Laravel 会自动注入控制器方法的依赖。
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* 显示指定用户个人资料。
*
* @param Request $request
* @param int $id
* @return Response
*/
public function show(Request $request, $id)
{
$value = $request->session()->get('key');
//
}
}
当你从 Session 获取数据时, 你也可以在 get 方法第二个参数里传递一个 default 默认值,如果 Session 里不存在键值对 key 的数据结果,这个默认值就会返回。如果你传递给 get 方法一个闭包作为默认值,这个闭包会被执行并且返回结果。
$value = $request->session()->get('key', 'default');
$value = $request->session()->get('key', function () {
return 'default';
});
全局 Session 助手函数
你也可以在 Session 里 使用 PHP 全局 session 函数获取和储存数据。当这个 session 函数以一个单独的字符串形式被调用时,它将会返回这个 Session 键值对的结果。当函数以 key /value 数组形式被调用时,这些值会被存储在 Session 里:
Route::get('/home', function () {
// 从 Session 获取数据 ...
$value = session('key');
// 设置默认值...
$value = session('key', 'default');
// 在Session 里存储一段数据 ...
session(['key' => 'value']);
});
获取所有 Session 数据
$data = $request->session()->all();
判断 Session 里是否存在条目
判断 Session 里是否存在一个条目,你可以使用 has 方法。如果条目存在且不为 null,has 方法返回 true:
if ($request->session()->has('users')) {
//
}
存储数据
Session 里存储数据, 你通常将使用 Request 实例中的 put 方法 或者 session 助手函数:
// 通过 Request 实例存储 ...
$request->session()->put('key', 'value');
// 通过全局 Session 助手函数存储 ...
session(['key' => 'value']);
Session 存储数组
push 方法可以把一个新值推入到以数组形式存储的 session 值里。例如:如果 user.teams 键值对有一个关于团队名字的数组,你可以推入一个新值到这个数组里:
$request->session()->push('user.teams', 'developers');
获取 & 删除条目
pull 方法会从 Session 里获取并且删除一个条目,只需要一步如下:
$value = $request->session()->pull('key', 'default');
删除数据
forget 方法会从 Session 中删除指定数据,如果想从 Session 中删除所有数据,可以使用 flush 方法:
// 删除单个值...
$request->session()->forget('name');
// 删除多个值...
$request->session()->forget(['name', 'status']);
$request->session()->flush();
表单验证
Laravel 提供了几种不同的方法来验证传入应用程序的数据。最常见的做法是在所有传入的 HTTP 请求中使用 validate 方法。
快速验证
/**
* 存储一篇新的博客文章。
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
// 博客文章验证通过...
}
验证规则可以使用数组而不是单个 | 分隔的字符串:
$validatedData = $request->validate([
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
]);
嵌套字段的说明
如果你的 HTTP 请求包含「嵌套」参数,你可以在验证规则中使用 . 语法来指定这些参数:
$request->validate([
'title' => 'required|unique:posts|max:255',
'author.name' => 'required',
'author.description' => 'required',
]);
另外,如果你的字段名称包含点,则可以通过使用反斜杠将点转义,以防止将其解释为 . 语法:
$request->validate([
'title' => 'required|unique:posts|max:255',
'v1\.0' => 'required',
]);
验证表单请求
创建表单请求验证
面对更复杂的验证场景,您可以创建一个「表单请求」。表单请求是一个包含了验证逻辑的自定义请求类。要创建一个表单请求类,请使用 make:request Artisan CLI 命令:
php artisan make:request StorePostRequest
该命令生成的表单请求类将被置于 app/Http/Requests 目录中。如果这个目录不存在,在您运行 make:request 命令后将会创建这个目录。Laravel 生成的每个表单请求都有两个方法:authorize 和 rules。
正如您可能已经猜到的那样,authorize 方法负责确定当前经过身份验证的用户是否可以执行请求操作,而 rules 方法则返回适用于请求数据的验证规则:
/**
* 获取应用于该请求的验证规则。
*
* @return array
*/
public function rules()
{
return [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
];
}
单个验证规则失败后停止
通过向您的请求类添加 stopOnFirstFailure 属性,您可以通知验证器一旦发生单个验证失败后,停止验证所有规则。
/**
* 表示验证器是否应在第一个规则失败时停止。
*
* @var bool
*/
protected $stopOnFirstFailure = true;
自定义错误消息
你可以通过重写表单请求的 messages 方法来自定义错误消息。此方法应返回属性 / 规则对及其对应错误消息的数组:
/**
* 获取已定义验证规则的错误消息。
*
* @return array
*/
public function messages()
{
return [
'title.required' => 'A title is required',
'body.required' => 'A message is required',
];
}
可用的验证规则
常用的数据库查询
获取结果
从表中检索所有行
你可以使用 DB facade 提供的 table 方法开始查询。table 方法为指定的表返回一个链式查询构造器实例,允许在查询上链接更多约束,最后使用 get 方法检索查询结果:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
{
/**
* 显示所有应用程序用户的列表。
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$users = DB::table('users')->get();
return view('user.index', ['users' => $users]);
}
}
get 方法返回包含查询结果的 Illuminate\Support\Collection 实例,每个结果都是 PHP stdClass 实例。可以将列作为对象的属性来访问每列的值:
use Illuminate\Support\Facades\DB;
$users = DB::table('users')->get();
foreach ($users as $user) {
echo $user->name;
}
从表中检索单行或单列
如果只需要从数据表中检索单行,可以使用 DB facade 中的 first 方法。 此方法将返回单个 stdClass 对象
$user = DB::table('users')->where('name', 'John')->first();
return $user->email;
如果不想要整行,可以使用 value 方法从纪录中提取单个值。此方法将直接返回列的值:
$email = DB::table('users')->where('name', 'John')->value('email');
如果要通过 id 字段值获取单行数据,可以使用 find 方法:
$user = DB::table('users')->find(3);
获取某一列的值
use Illuminate\Support\Facades\DB;
$titles = DB::table('users')->pluck('title');
foreach ($titles as $title) {
echo $title;
}
聚合函数
查询构建器还提供了多种检索聚合值的方法,例如 count, max, min, avg, 和 sum。您可以在构建查询后调用这些方法中的任何一个:
use Illuminate\Support\Facades\DB;
$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');
判断记录是否存在
除了通过 count 方法可以确定查询条件的结果是否存在之外,还可以使用 exists 和 doesntExist 方法:
if (DB::table('orders')->where('finalized', 1)->exists()) {
// ...
}
if (DB::table('orders')->where('finalized', 1)->doesntExist()) {
// ...
}
Select 语句
你可能不是总是希望从数据库表中获取所有列。使用 select 方法,你可以自定义一个 「select」 查询语句来查询指定的字段:
use Illuminate\Support\Facades\DB;
$users = DB::table('users')
->select('name', 'email as user_email')
->get();
distinct 方法会强制让查询返回的结果不重复:
$users = DB::table('users')->distinct()->get();
如果你已经有了一个查询构造器实例,并且希望在现有的查询语句中加入一个字段,那么你可以使用 addSelect 方法
$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();
模型的增删查改
简介
Laravel 包含了 Eloquent,这是一个对象关系映射器(ORM),使与数据库的交互变得很愉快。使用 Eloquent 时,每个数据库表都有一个对应的「模型」,用于与该表进行交互。除了从数据库表中检索记录外,Eloquent 模型还允许您从表中插入,更新和删除记录。
生成模型类
php artisan make:model Flight
如果你想要在生成模型类的同时生成 数据库迁移,可以使用 --migration 或 -m 选项:
php artisan make:model Flight --migration
在生成模型的同时,你可能还想要各种其他类型的类,例如模型工厂、数据填充和控制器。这些选项可以组合在一起从而一次创建多个类:
# 生成模型和 Flight工厂类...
php artisan make:model Flight --factory
php artisan make:model Flight -f
# 生成模型和 Flight 数据填充类...
php artisan make:model Flight --seed
php artisan make:model Flight -s
# 生成模型和 Flight 控制器类...
php artisan make:model Flight --controller
php artisan make:model Flight -c
# 生成模型,Flight 控制器类,资源类和表单验证类...
php artisan make:model Flight --controller --resource --requests
php artisan make:model Flight -crR
# 生成模型和 Flight 授权策略类...
php artisan make:model Flight --policy
# 生成模型和数据库迁移,Filght 工厂类,数据库填充类和 Flight 控制器...
php artisan make:model Flight -mfsc
# 快捷生成模型,数据库迁移,Flight 工厂类,数据库填充类,授权策略类,Flight 控制器和表单验证类...
php artisan make:model Flight --all
# 生成中间表模型...
php artisan make:model Member --pivot
数据库连接
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* 设置当前模型使用的数据库连接名。
*
* @var string
*/
protected $connection = 'sqlite';
}
查看所有数据
Fruits::all();
插入一条数据
Fruits::insert([
'name' => '222',
'num' => 222,
'price' => 222
]);
删除一条数据
Fruits::query()
->where('id', 1)
->delete();
}
更新一条数据
$fruit = Fruits::query()
->where('id', 2)->first();
$fruit->name = 'banner1';
$fruit->save();
分页
对查询构造器结果进行分页
有几种方法可以对结果进行分页,最简单的方法是在 query builder 或 Eloquent query。上使用 paginate 方法 ,paginate 方法根据用户查看的当前页面自动设置查询的 「limit」 和 「offset」 , 默认情况下,通过 HTTP 请求中的 page 查询字符串参数的值检测当前页面, Laravel 会自动检测这个值,它也会自动插入到分页器生成的链接中。
在下面的例子中,传递给 paginate 方法的唯一参数是你想要在一页中显示的记录数。在此例中,我们希望「每页」显示 3 条数据:
public function fy() {
return DB::table('fruits')->paginate(3);
}
Eloquent ORM 分页
public function fy() {
return Fruits::query()->paginate(3);
}
简单分页
paginate 方法会在查询数据库之前先计算与查询匹配的记录总数,从而让分页器知道总共需要有多少个页面来显示所有的记录。不过,如果你不打算在界面上显示总页数的话,那么计算记录总数是没有意义的。
因此,如果你只需要显示一个简单的「上一页」和「下一页」链接的话, simplePaginate 方法是一个更高效的选择:
return Fruits::query()->simplePaginate(3)
也可以在调用 paginate 方法之前为查询添加其他约束,例如 where 子句:
return DB::table('fruits')->where('id' ,'>', 5)->simplePaginate(3)
缓存
在某些应用中,一些查询数据或处理任务的操作会在某段时间里短时间内大量进行,或是一个操作花费好几秒钟。当出现这种情况时,通常会将检索到的数据缓存起来,从而为后面请求同一数据的请求迅速返回结果。
缓存使用
从缓存中检索项目
Cache 门面的 get 方法用于从缓存中检索项目。如果缓存中不存在该项目,则将返回 null。如果您愿意,您可以将第二个参数传递给 get 方法,指定您希望在项目不存在时返回的默认值:
$value = Cache::get('key');
$value = Cache::get('key', 'default');
检查项目是否存在
if (Cache::has('key')) {
//
}
在缓存中存储项目
您可以使用 Cache Facade 上的 put 方法将项目存储在缓存中:
Cache::put('key', 'value', $seconds = 10);
如果存储时间没有传递给 put 方法,该项目将被无限期存储:
Cache::put('key', 'value');
如果不存在则存储
add 方法只会将缓存存储中不存在的项目添加到缓存中。如果项目实际添加到缓存中,该方法将返回 true。 否则,该方法将返回 false。 add 方法是一个原子操作:
Cache::add('key', 'value', $seconds);
永久存储
forever 方法可用于将项目永久存储在缓存中。由于这些项目不会过期,因此必须使用 forget 方法手动将它们从缓存中删除:
Cache::forever('key', 'value');
从缓存中删除项目
您可以使用 forget 方法从缓存中删除项目:
Cache::forget('key');
您可以使用 flush 方法清除整个缓存:
Cache::flush();
缓存助手函数
除了使用 Cache 门面之外,您还可以使用全局 cache 函数通过缓存检索和存储数据。当使用单个字符串参数调用 cache 函数时,它将返回给定键的值:
$value = cache('key');
如果您向函数提供键 / 值对数组和过期时间,它将在指定的持续时间内将值存储在缓存中:
cache(['key' => 'value'], $seconds);
cache(['key' => 'value'], now()->addMinutes(10));
模型关联
一对一
我们有两张表,需要把两张表关联起来,fruits是水果,reserve是水果被谁预定的
Models/Fruits.php
public function reserve() {
return $this->hasOne(Reserve::class, 'fruit_id');
}
Controller
查询水果id为3是被谁预定的
return Fruits::query()->find(3)->reserve;
一对一反向查询
通过reserve中的数据来查询用户预定了哪些水果,在Reserve模型中添加:belongsTo方法
public function fruit()
{
return $this->belongsTo(Fruits::class);
}
控制器:
$fruit = Reserve::query()->find(1)->fruit;
return $fruit;
一对多
将Fruits控制器中的hasOne替换成hasMany
public function reserve()
{
return $this->hasMany(Reserve::class, 'fruit_id');
}
也可以添加条件约束
$fruit_reserve = Fruits::query()->find(2)->reserve->where('id', '>', 5);
return $fruit_reserve;
一对多反向
通过reserve中的数据来查询用户预定了哪些水果,在Reserve模型中添加:belongsTo方法
public function fruit()
{
return $this->belongsTo(Fruits::class);
}
控制器:
$fruit = Reserve::find(2)->fruit;
return $fruit;