Laravel 使用:在类型为 datetime-local 的 input 中显示日期

类型属性为 datetime-local 的HTML输入用于显示表单字段并输入日期和时间:

1
<input type="datetime-local" >

在本教程中,了解如何在 datetime-local HTML input 中显示Laravel模型中的日期(天、月、年、小时、分钟和秒)。

要在HTML表单的 datatime-local 表单中显示Laravel模型的日期(email_verified_at、created_at、updated_at…),我们首先需要确保数据库表中的列是用 timestamp 数据类型定义的。

在Laravel迁移中,我们使用 timestamp() 方法来定义时间戳列的模式:

1
2
$table->timestamp('email_verified_at')->nullable(); // column email_verified_at
$table->timestamps(); // columns created_at and updated_at

如果您有另一个存储日期的列,则可以通过模型中的$casts属性将其属性转换为日期格式(Carbon实例):

1
protected $casts = [ "online_at" => "datetime" ];

在视图(Blade模板)中,我们可以使用 format() 方法将日期和时间格式化为与datetime-local HTML字段兼容并可用的字符串,以显示它。
例如,对于具有 created_at 列的 User 模型,我们可以使用以下语法在 datetime-local 字段中显示日期和时间:

1
<input type="datetime-local" name="created_at" value="{{ $user->created_at->format('Y-m-d\TH:i:s') }}">

在本例中,我们使用 format() 方法将模型的 created_at 日期转换为 Y-m-d\TH:i:s 格式的字符串,这是HTML datetime-local 字段的兼容格式。\T 字符用于分隔字符串中的日期和时间。

要在日期类型的HTML输入中显示 date,兼容格式为 Y-m-d

1
<input type="date" name="online_at" value="{{ $post->online_at->format('Y-m-d') }}" >

提示:我们也可以通过 $casts 属性在模型中格式化日期,而不是在Blade视图中格式化日期:

1
protected $casts = [ "online_at" => "datetime:Y-m-d\TH:i:s" ];

原文:https://wilo-ahadi.com/posts/laravel-show-a-date-in-a-datetime-local-input

Laravel 入门:23-用户授权

对于多用户使用的系统,必须要考虑的是当前用户有没有权限去访问某一资源(比如系统设置只允许管理员访问操作),有没有权限执行某一操作(比如某一用户填写的表单其他用户不能删除)。

Laravel 主要提供了两种授权操作的方法: 拦截器(Gates)策略(Policies)

文档中说:

拦截器(gates),更适用于没有与任何模型或资源有关的授权操作,例如查看管理员仪表盘。与之相反,当您希望为特定的模型或资源进行授权管理时,应该使用策略(policies) 方法。

以此去理解的话,文档中举得例子就不是那么合理了。

比如有一个博客系统,用户有几类角色:管理员(admin)、作者(author),使用 User 模型的 role 字段来保存。博客系统设置只允许管理员操作,那么我们就可以定义一个 gate:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

namespace App\Providers;

use App\Models\User;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;

class AuthServiceProvider extends ServiceProvider
{
public function boot()
{
$this->registerPolicies();

//
Gate::define('settings', function (User $user){
return $user->role == 'admin';
});
}
}

使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--comment0-->
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
class SettingsController extends Controller
{
public function index(){
if (! Gate::allows('settings')) {
abort(403);
}

//TODO
}
}

用户发布文章的相关授权则可以通过策略实现:

1
php artisan make:policy PostPolicy --model=Post

通过上面命令可以看出,策略是和模型绑定的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php

namespace App\Policies;

use App\Models\Post;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class PostPolicy
{
use HandlesAuthorization;

public function viewAny(User $user)
{
//
}

public function view(User $user, Post $post)
{
//
}

public function create(User $user)
{
//
}

public function update(User $user, Post $post)
{
return $user->id == $post->user_id || $user->role == 'admin';
}

public function delete(User $user, Post $post)
{
//
}

public function restore(User $user, Post $post)
{
//
}

public function forceDelete(User $user, Post $post)
{
//
}
}

和我们通过 php artisan make:controller PostController --resource 创建的控制器中的方法差不多是对应的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

namespace App\Providers;

use App\Models\User;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;

class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
// 'App\Models\Model' => 'App\Policies\ModelPolicy',
'App\Models\Post' => 'App\Policies\PostPolicy'
];

然后判断用户是否有权限就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class PostController extends Controller
{
/**
* 更新指定的博客文章
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Post $post
* @return \Illuminate\Http\Response
*
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function update(Request $request, Post $post)
{
$this->authorize('update', $post);

// 或者
if ($request->user()->cannot('update', Post::class)) {
abort(403);
}
}
}

其他在视图或路由的判断参考文档。

对于一些稍复杂的系统可通过 https://github.com/spatie/laravel-permission 等进行权限管理。

Laravel 入门:02-搭建开发环境 & 创建项目

我本人使用的是 Windows 操作系统,涉及到的软件安装也是在 Windows 操作系统上。

感觉 Windows 使用 WSL 安装 Linux 虚拟机,然后搭建开发环境,挺好用。

使用 WSL 在 Windows 上安装 Linux

https://github.com/laravel/homestead 下载压缩包。

这里是为了使用 homestead/bin/wsl-init 脚本。

录了个简单的视频上传到了 B 站:

Windows 使用 WSL 虚拟机搭建 Laravel 开发环境

2023.05.11


一、安装 Git

下载 Git 并安装。

顺便生成 ssh key ,打开 Git Bash,运行命令:

1
ssh-keygen -t rsa

二、开发环境

1、“多合一” 安装套件

一次性安装 PHP、Nginx(Apache)、MySql 等,适合新手,安装简单,但是在 Windows 平台上,如果部署到 Linux 平台(通常生产环境都是基于 Linux 平台)可能存在兼容问题(常见的是目录、文件名的大小写),知名的有 [XAMPP] (https://www.apachefriends.org/) 、MAMPLaragon 等。

安装 Composer

https://getcomposer.org/download/

创建项目:

1
composer create-project laravel/laravel laravel-demo

2、Homestead

这是 Laravel 在 8.5 之前推荐的开发环境,基于虚拟机的 Linux 环境。参考文档:https://learnku.com/docs/laravel/8.x/homestead/9357。我觉着这套环境挺好用😓。

2.1 首先安装 VirtualBoxVagrant

VirtualBox 下载地址:https://www.virtualbox.org/wiki/Downloads

Vagrant 下载地址:https://www.vagrantup.com/downloads

2.2 安装 Homestead Vagrant Box

打开 Git BashWindows PowerShellWindows Terminal 等), 运行命令:

1
vagrant box add laravel/homestead

2.3 安装 Homestead

1
2
3
4
5
git clone https://github.com/laravel/homestead.git ~/Homestead

cd ~/Homestead

git checkout release

2.4 配置 Homestead

进入安装目录(C:\Users\用户名\Homestead),双击运行 init.bat 命令创建 Homestead.yaml 配置文件。

假如我在 E:/App/PHP 目录下创建新项目laravel-demo(这里创建该文件夹即可),接下来编辑 Homestead.yaml,主要修改如下所示:

1
2
3
4
5
6
7
8
9
10
folders:
- map: E:/App/PHP/laravel-demo
to: /home/vagrant/code/laravel-demo

sites:
- map: laravel-demo.test
to: /home/vagrant/code/laravel-demo/public

databases:
- laravel-demo

2.5 主机名解析

修改 C:\Windows\System32\drivers\etc 目录下的 hosts 文件,添加:

1
192.168.10.10  laravel-demo.test

2.6 启动 Vagrant Box

1
2
cd ~/Homestead
vagrant up

可能遇到的问题:

1
2
C:/HashiCorp/Vagrant/embedded/gems/2.3.3/gems/childprocess-4.1.0/lib/childprocess/windows/process_builder.rb:44:
in `encode!': "\\xE5" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to UTF-16LE (Encoding::UndefinedConversionError)

解决办法请参考 https://blog.csdn.net/qq_41606390/article/details/122854431

2.7 通过 SSH 连接

1
vagrant ssh

将会以 SSH 的方式连接到虚拟机:

1
2
3
4
5
6
7
# 进入 code 目录
cd code

# 查看当前目录下的项目
ls -l

composer create-project laravel/laravel laravel-demo
  • 👊 如果遇到文件夹权限问题,请选则以管理员身份打开 Git Bash 等终端。 *

在浏览器中访问 laravel-demo.test 查看是否正常。

2.8 vagrant 的常用命令(管理虚拟机)

启动:

1
vagrant up

关闭:

1
vagrant halt

远程连接到虚拟机:

1
vagrant ssh

删除虚拟机(本来用的好好的,忽然遇到启动报错、远程连接到虚拟机报错,便可运行此命令):

1
vagrant destroy

查看安装的虚拟机:

1
vagrant box list

如果修改了 Homestead.yaml,运行如下命令重新加载配置:

1
vagrant reload --provision

其他的命令可运行帮助命令查看:

1
vagrant --help

2.9 连接数据库

下载安装 MySql Workbench(https://dev.mysql.com/downloads/workbench/) 、DBeaver(https://dbeaver.io/download/) 或其他数据库管理工具,默认服务器地址:192.168.10.10,用户名:homestead,密码:secret,一个示例:

3、 Sail

3.1 开启 WSL, 并安装 Linux

https://learn.microsoft.com/zh-cn/windows/wsl/install

3.2 安装 Docker Desktop

https://www.docker.com/products/docker-desktop/

3.3安装 Windows Terminal

https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701

3.4 创建项目

打开虚拟机

创建项目

1
2
3
cd laravel-demo

./vendor/bin/sail up #可能需要很长一段时间

参考:https://learnku.com/docs/laravel/9.x/installation/12200#2e8ee3

三、IDE

1、PhpStorm

虽然有人抱怨 PhpStorm 臃肿占内存,但我觉得它是最好用的 PHP IDE。“术业有专攻”,不需要额外的配置,安装激活便可使用。如果是高校学生,有 .edu.cn 邮箱的话,建议使用 PhpStorm,下面的链接注册后可以获取免费注册码(有效期一年,结束后可继续获取):

https://www.jetbrains.com/shop/eform/students

2、Vs Code

需要安装插件:

PHP Intelephense

参考:

https://blog.theodo.com/2019/07/vscode-php-development/

Laravel 入门:01-开篇

Laravel 是款比较热门的基于 PHP 语言的 Web 开发框架,有成熟的开发者社区,有完善的文档可供参阅, Github 上有足够多的包(Packages)可供使用。

但是,文档是基于功能组织的,对于初学者而言,在项目中串联起来还是需要一定的时间和实践,况且框架中现在默认的前端是基于 Tailwind CSSVue ,对于初学者理解和使用 Laravel 并不友好。

本系列入门教程,根据我自己的理解,把文档中的基础知识点串联起来,提供一个循序渐进学习的脉络,以期能给新入坑的同学一些启示

官网:

https://laravel.com

https://bootcamp.laravel.com

国内的社区:

Learnku:https://learnku.com/laravel

Laravel 学院:https://laravelacademy.org

Laravel 版本更新比较快(参考 [发行说明]https://learnku.com/docs/laravel/9.x/releases/12197)),相对的,官方的文档更新也最及时,国内的翻译还是基于大版本更新时的文档为主,后面小版本更新后的文档就不那么及时了,如果对 Laravel 比较熟悉, 可以尝试查阅官方的文档(当然是英文😅)。

深入学习:

1、穿透Laravel

Github::https://github.com/youngtrix/pierce_through_the_laravel

在线阅读:http://www.idocloud.net/pttl/index.html

Demo:https://github.com/hefengbao/laravel-demo

Laravel 入门:03-概览

在 IDE 中打开项目文件,可以参考文档中的『目录结构』(https://learnku.com/docs/laravel/9.x/structure/12202) 先了解一些各个目录、文件的功用。

一、统一入口

在学习 PHP 的时候,我们知道访问站点的时候默认会访问根目录下的 index.php 文件,而 Laravel 的入口文件是 public/index.php ,也是唯一的一个 index.php,称为统一入口,所有的访问都是经该入口转发到路由文件,比如: http://laravel-demo.test/index.php/articles,通常部署站点的时候都会在 url 中隐去 index.php,于是访问的 url 变成 http://laravel-demo.test/articles ,这个操作是在 Web 服务器配置的(先了解一下就好):

Apache 配置参考 public/.htaccess

1
2
3
4
# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

Nginx 配置参考 https://learnku.com/docs/laravel/9.x/deployment/12204#62e0b5 :

1
2
3
location / {
try_files $uri $uri/ /index.php?$query_string;
}

上面提到的路由,具体是在 routes 目录下定义,初学关注 web.php 即可。

二、 MVC

Laravel是一款采用了mvc架构模式的 Web 开发框架:

  • M 是模型(model),定义在 app/Models 目录下;
  • V 是视图(view),定义在 resources/views 目录下;
  • C 是控制器(controller),定义在 app/Http/Controllers 目录下。

通常定义的每条路由对应一个控制器中的一个方法,在该方法中,可以根据一个或多个模型获取数据,然后渲染到一个视图文件。

2.1 Controller

主要的业务逻辑都在这里,知识点比较多:

请求:

响应:

表单验证:

缓存:

文件存储:

集合:

事件:

邮件:

等等。

2.2 Model

一个模型往往对应一张数据表,模型是和数据库交互的桥梁,知识点主要是:数据库(https://learnku.com/docs/laravel/9.x/database/)和 Eloquent ORM (https://learnku.com/docs/laravel/9.x/eloquent)

2.3 View

主要知识点是Blade模板(https://learnku.com/docs/laravel/9.x/blade/12216)和视图(https://learnku.com/docs/laravel/9.x/views/12215)

Demo:https://github.com/hefengbao/laravel-demo

Laravel 入门:04-路由

一、基本路由

所有的路由文件都位于 routes 目录下,routes/web.php 中已经定义好了一个路由:

1
2
3
Route::get('/', function () {
return view('welcome');
});

但是一般情况下,格式为:Route::路由方法('uri', ['控制器','方法'])->name('路由命名') ;

假设有控制器 app/Http/Controllers/UserController::class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
public function index()
{
echo 'Hello, World!';
}

public function create()
{

}

public function store(Request $request)
{

}

public function edit($id)
{

}

public function update($id, Request $request)
{

}

public function show($id)
{
echo $id;
}

public function destroy($id)
{

}
}

则可以定义路由:

1
2
3
4
5
6
7
Route::get('/users',[\App\Http\Controllers\UserController::class, 'index'])->name('users.index');
Route::get('/users/create', [\App\Http\Controllers\UserController::class, 'create'])->name('users.create');
Route::post('/users', [\App\Http\Controllers\UserController::class, 'store'])->name('users.store');
Route::get('/users/{id}', [\App\Http\Controllers\UserController::class, 'show'])->name('users.show');
Route::get('/users/{id}/edit', [\App\Http\Controllers\UserController::class, 'edit'])->name('users.edit');
Route::put('/users/{id}', [\App\Http\Controllers\UserController::class, 'update'])->name('users.update');
Route::delete('/users/{id}', [\App\Http\Controllers\UserController::class, 'destroy'])->name('user.destroy');

访问 http://laravel-demo.test/users/index

二、路由方法

常用的 get,post,put, patch, delete, options 和 HTTP 方法一一对应,可参照理解。

三、路由参数

Route::get('/users/{id}', [\App\Http\Controllers\UserController::class, 'show'])->name('users.show') 中的 id 即为路由参数, 访问的url 为: http://laravel-demo.test/users/1 , id 必须有值,如果 id 可以为空,则可以这样定义:

1
Route::get('/users/{id?}', [\App\Http\Controllers\UserController::class, 'show']);

一个路由中可以有多个参数,比如:

1
Route::get('/users/{id}/comments/{commentId}', [\App\Http\Controllers\UserController::class, 'show']);

对应到控制器中:

1
2
3
4
5
class UserController extends Controller
{
//这里的参数命名可以和路由中的参数命名不一样,但要记得,顺序是一样的,第一个参数获取的一定是 id, 第二个参数是commentId
public function show($id, $commentId){}
}

四、路由命名

在路由中使用 name() 方法给该路由命名,比如:

1
Route::get('/users/{id}', [\App\Http\Controllers\UserController::class, 'show'])->name('users.show');

路由命名的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class UserController extends Controller
{
public function index()
{
echo route('name.index');
}

public function show($id)
{
echo route('name.show', $id);
// 或者
echo route('name.show', ['id' => $id]);
}
}

五、路由分组(前缀、中间件)

路由前缀、路由中间件都是结合路由分组使用,比如管理后台的路由:

1
2
3
Route::prefix('admin')->group(function(){
Route::get('/', [\app\Http\Controllers\Admin\HomeController::class, 'index']);
});

如果项目很复杂,管理后台的路由可单独放在一个文件中,在 routes 目路中,新建 admin.php, 然后再 app/Providers/RouteServiceProvider::classboot 方法中添加:

1
2
3
4
5
6
7
8
$this->routes(function () {
...

// 仿照添加即可
Route::middleware('web')
->prefix('admin')
->group(base_path('routes/admin.php'));
});

路由中间件后面再说。

Demo:https://github.com/hefengbao/laravel-demo

https://laravel-news.com/managing-routes

1
2
3
$route = Route::current();
$name = Route::currentRouteName();
$action = Route::currentRouteAction();

Laravel 入门:05-Artisan 命令行

artisan 命令提供了许多有用的工具,可以使用 list 命令查看:

1
php artisan list

比较常用的是生成脚手架(scaffold),可以通过运行命令 php artisan make 查看, 例如:

1
2
3
4
5
6
7
8
# 创建控制器
php artisan make:controller UserController

# 创建模型
php artisan make:model Post

# 创建请求验证文件
php artisan make:request UserRequest

上面的举例是最基础的,比如 php artisan make:model Post 后面还可以添加参数:

1
2
3
4
5
# 同时生成数据库迁移文件
php artisan make:model Post -m

# 同时生成控制器
php artisan make:model Post -c

可以使用 help 命令查看详细的参数说明, 例如:

1
php artian help make:model

先了解一下,在接下来的文章中会用到大部分 make 相关的命令。

参考文档 https://learnku.com/docs/laravel/9.x/artisan/12222

Demo:https://github.com/hefengbao/laravel-demo

Laravel 入门:06-控制器

一、创建控制器

控制器在 app/Http/Controllers 目录下,默认新建的控制器应继承自该目录下的 Controller::class,可以使用 php artisan make:controller 命令创建类:

1
php artisan make:controller UserController
1
2
3
4
5
6
7
8
9
10
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
//
}

如上面代码所示,里面没有任何方法,我们可以添加 -r 参数,创建一个资源控制器(resource controller),即所谓的 CURD:它代表创建(Create)、更新(Update)、读取(Read)和删除(Delete)操作:

1
php artisan make:controller UserController -r
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
public function index()
{
//
}

public function create()
{
//
}

public function store(Request $request)
{
//
}

public function show($id)
{
//
}

public function edit($id)
{
//
}

public function update(Request $request, $id)
{
//
}

public function destroy($id)
{
//
}
}

二、定义路由

参照在路由那一篇的内容,我们可以这样定义:

1
2
3
4
5
6
7
Route::get('/users',[\App\Http\Controllers\UserController::class, 'index'])->name('users.index');
Route::get('/users/create', [\App\Http\Controllers\UserController::class, 'create'])->name('users.create');
Route::post('/users/store', [\App\Http\Controllers\UserController::class, 'store'])->name('users.store');
Route::get('/users/{id}', [\App\Http\Controllers\UserController::class, 'show'])->name('users.show');
Route::get('/users/{id}/edit', [\App\Http\Controllers\UserController::class, 'edit'])->name('users.edit');
Route::put('/users/{id}/update', [\App\Http\Controllers\UserController::class, 'update'])->name('users.update');
Route::delete('/users/{id}', [\App\Http\Controllers\UserController::class, 'destroy'])->name('user.destroy');

但是对于资源控制器,我们可以把上面的路由简化为:

1
Route::resource('/users', \App\Http\Controllers\UserController::class);

有时我们可能不需要删除操作,那么可以这样排除掉:

1
Route::resource('/users', \App\Http\Controllers\UserController::class)->except(['destroy']);

或者只需要 indexshow ,那么可以只添加:

1
Route::resource('/users', \App\Http\Controllers\UserController::class)->only(['index','show']);

当然这只是脚手架创建的一般功能下的控制器,如果要实现别的功能,比如导出,我们可以继续在 UserController::class 中添加添加 export 方法,并定义相应的路由:

1
2
3
4
5
6
7
8
9
10
11
12
13
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
...

public fun export()
{
//todo
}
}
1
2
Route::get('/users/export', [\App\Http\Controllers\UserController::class, 'export'])->name('users.export');
Route::resource('/users', \App\Http\Controllers\UserController::class);

Demo:https://github.com/hefengbao/laravel-demo

Laravel 入门:08-模型设置

一、数据库连接

Laravel 模型中可以通过修改 $connection 属性设置设置数据库连接:

1
2
3
4
class Post extends Model
{
protected $connection = 'mysql2';
}

二、数据表名称

前面的文章中说过,一个模型对应一张数据表,默认约定数据表名称是模型名称复数的小写,例如 Post 默认对应数据表 posts, User 默认对应数据表 users,如果不符合这个规则,则要指定数据表名称,在模型中使用 $table 属性指定数据表名称:

1
2
3
4
class Post extends Model
{
protected $table = 'posts';
}

三、主键

无论是通过 php artisan make:model Post -m 或者 php artisan make:migration create_posts_table 创建的默认迁移文件:

1
2
3
4
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->timestamps();
});

其中 $table->id() 生成的就是自增主键 id,如果要使用 uuid ,则可以使用 $table->uuid() ,如果要修改默认名称 uuid,可以这样做 $table->uuid('id')

默认主键名称为 id,如果是其他名称,则应通过修改 $primaryKey 指定:

1
2
3
4
class Post extends Model
{
protected $primaryKey = 'uuid';
}

默认主键是自增的整数,如果你的项目总主键不是自增,则应修改 $incrementing 属性:

1
2
3
4
class Post extends Model
{
protected $incrementing = false;
}

如果主键不是 integer 类型,比如使用的是 uuid,则应修改 $keyType 属性,指定数据类型:

1
2
3
4
class Post extends Model
{
protected $keyType= 'string';
}

四、时间戳

数据库迁移表中的 $table->timestamps() 会生成两个时间戳字段 created_atupdated_at (框架会自动维护这两个字段的值变更),如果不需要这两个字段,则应修改 $timestamps 属性禁用:

1
2
3
4
class Post extends Model
{
protected $timestamps = false;
}

如果要自定义这个连个字段名称,例如:

1
2
3
4
5
class Post extends Model
{
const CREATED_AT = 'creation_date';
const UPDATED_AT = 'updated_date';
}

五、fillable,hidden

可以查看默认的 User 模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
class User extends Authenticatable
{
protected $fillable = [
'name',
'email',
'password',
];

protected $hidden = [
'password',
'remember_token',
];
}

先举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;

class UserController extends Controller
{
public function create()
{
User::create([
'name' => '张三',
'email' => 'zhangsan@qq.com',
'password' => Hash::make('zhangsan'),
'remember_token' => Str::random(40)
]);
}
}

这样创建模型时,remember_token 不会被保存到数据库中,这便是 $fillalbe 的作用,指定那些属性可以批量赋值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;

class UserController extends Controller
{
public function create()
{
$user = User::create([
'name' => '张三',
'email' => 'zhangsan@qq.com',
'password' => Hash::make('zhangsan'),
'remember_token' => Str::random(40)
]);

return $user;
}
}

访问 http://laravel-demo.test/users/create 查看结果:

1
2
3
4
5
6
7
{
"name": "张三",
"email": "zhangsan@qq.com",
"updated_at": "2022-12-16T10:40:11.000000Z",
"created_at": "2022-12-16T10:40:11.000000Z",
"id": 1
}

$hidden 属性指定模型序列化时(生成json)时隐藏哪些字段,可以修改 $hidden 属性中的字段,再次访问对比结果。

参考文档:

Eloquent 模型约定:https://learnku.com/docs/laravel/9.x/eloquent/12251#e5bc93

批量赋值:https://learnku.com/docs/laravel/9.x/eloquent/12251#c7d398

Demo:https://github.com/hefengbao/laravel-demo

Laravel 入门:07-数据库&模型

在框架中,一般数据库和模型是一一对应的,一个模型对应一张数据表,称之为ORM(Object Relational Mapping, 对象关系映射)。

一、数据库配置

一般配置修改根目录下的 .env 文件:

1
2
3
4
5
6
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel-demo
DB_USERNAME=homestead
DB_PASSWORD=secret

对应的配置文件是 config/database.php :

1
2
3
4
5
6
<?php
return [
'connections' => [
'mysql' => []
];
];

假如要连接多个数据库,在 .env 文件中追加配置,比如:

1
2
3
4
5
DB_HOST2=127.0.0.1
DB_PORT2=3306
DB_DATABASE2=laravel
DB_USERNAME2=root
DB_PASSWORD2=

然后在 config/database.php 文件中添加:

1
2
3
4
5
6
7
8
<?php
return [
'connections' => [
'mysql' => [],
// 参考默认的配置即可
'mysql2' => []
],
];

二、创建模型 & 创建数据表(数据库迁移文件)

建议使用 php artisan make:model XX -m 命令行创建:

1
2
3
4
5
6
7
php artisan make:model Post --migration
//或者
php artisan make:model Post -m


INFO Model [app/Models/Post.php] created successfully.
INFO Migration [database/migrations/2022_12_15_105154_create_posts_table.php] created successfully.

该命令同时创建模型和数据表,模型在 app/ Models 目录下, 数据表在 database/migrations 目录下。

编辑 2022_12_15_105154_create_posts_table.php (各人创建的文件名会不一样,主要是前面的时间戳) 文件:

1
2
3
4
5
6
7
Schema::create('posts', function (Blueprint $table) {    
$table->id();
$table->unsignedBigInteger('user_id')->comment('作者');
$table->string('title')->comment('标题');
$table->string('body')->comment('内容');
$table->timestamps();}
);

默认的数据库连接是 mysql(即 app/database.php 配置文件中 connections 中的 mysql), 如果需要连接其他数据库,则可以在模型或迁移文件中指定:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!--comment0-->

class Post extends Model
{
protected $connection = 'mysql2';
}

//或者 database/migrations/2022_12_15_105154_create_posts_table.php

return new class extends Migration
{
protected $connection = 'mysql2';
}

//当然,也可以同时配置

参考文档:

生成模型类:https://learnku.com/docs/laravel/9.x/eloquent/12251#generating-model-classes

数据库迁移:https://learnku.com/docs/laravel/9.x/migrations/12248

三、运行数据库迁移(在数据库中创建数据表)

1
2
3
php artisan migrate

php artisan migrate --force // 不要在生产环境中使用哦

参考文档:https://learnku.com/docs/laravel/9.x/migrations/12248#018aef

四、数据填充

可用 Factory 和 Seed 配合批量填充测试数据,创建 PostFactoryPostSeeder

1
2
3
4
5
6
7
8
php artisan make:factory PostFactory

php artisan make:seeder PostSeeder

// 在创建模型的时候也可以同时创建 factory 和 seed
php artisan make:model Post --migration --factory --seed
//或者
php artisan make:model Post -mfs

参考 database/factories/UserFactory.php 修改 PostFactory :

1
2
3
4
5
6
7
8
9
10
11
class PostFactory extends Factory
{
public function definition()
{
return [
'user_id' => 1,
'title' => fake()->title(),
'body' => fake()->paragraph()
];
}
}

修改 database/seeders/PostSeeder.php

1
2
3
4
5
6
7
class PostSeeder extends Seeder
{
public function run()
{
Post::factory()->count(10)->create();
}
}

运行 seeders :

1
php artisan db:seed --class=PostSeeder

可以连接数据库查询。

参考文档:https://learnku.com/docs/laravel/9.x/seeding/12249

Demo:https://github.com/hefengbao/laravel-demo