模型文件
默认生成的模型文件
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
}
-
HasApiTokens
API 令牌修改功能; -
HasFactory
模型工厂相关功能; -
Notifiable
消息通知相关功能; -
Authenticatable
授权相关功能; -
$casts
指定字段使用的数据类型 -
$fillable
过滤用户提交的字段,只有包含在该属性中的字段才可以被正常更新 -
$hidden
可以对密码或其他敏感信息在用户实例通过数组或 JSON 显示时进行隐藏
模型文件
创建模型文件
php artisan make:model Article
模型类名称使用 单数 的形式命名
同时创建迁移文件
创建模型文件的同时创建迁移文件,使用 -m
或 --migration
:
php artisan make:model Article -m
Eloquent 数据模型
正常情况下,一个最小代码的 Eloquent 模型如下:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
use HasFactory;
}
表名约定
Eloquent 模型默认情况下会使用类的 「下划线命名法」 与 「复数形式名称」来作为数据表的名称生成规则。如:
- User 模型类对应
users
表; - BlogPost 模型类对应
blog_post
表;
也可以自己定义表名,通过 table
属性定义,例如:
protected $table = 'my_tables';
约定优于配置
『约定优于配置』(convention over configuration)是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。如果所用工具的约定与你的期待相符,便可省去配置;反之,你可以配置来达到你所期待的方式。
Eloquent 数据表的命名机制就属于 『约定优于配置』 ,数据模型类 Article
按照系统约定对应于 articles
数据表,如需使用其他名称,可通过配置 $table
实现。
创建用户
使用 create
方法。
App\Models\User::create(['name'=> 'Summer', 'email'=>'summer@example.com','password'=>bcrypt('password')])
查找用户
查找 id 是1的用户:
App\Models\User::find(1);
在用户不存在时报错,使用 findOrFail
方法:
App\Models\User::findOrFail(1222);
查找第一个用户
App\Models\User::first();
查找全部用户
App\Models\User::all();
更新用户信息
- 通过给用户对象的属性进行赋值,之后使用
save
方法保存 - 调用
update
方法更新
$user = User::find($id);
$user->name = 'star';
$model->save();
一般较常用的是 使用 update
方法更新:
$user->update(['name'=>'Star'])
删除用户
App\Models\User::destroy(1);
列出所有用户
$users = User::all();
模型工厂
Laravel 默认提供了 Faker 扩展包,使用它可以很方便地生成一些测试数据。
数据填充
Laravel 中使用 Seeder
类为数据库添加测试数据。所有的 Seeder
类文件都放在 database/seeders
目录下。
生成用户填充文件:
php artisan make:seeder UsersTableSeeder
database/seeders/UsersTableSeeder.php
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\User;
class UsersTableSeeder extends Seeder
{
public function run()
{
User::factory()->count(50)->create();
$user = User::find(1);
$user->name = 'Summer';
$user->email = 'summer@example.com';
$user->save();
}
}
database/seeders/DatabaseSeeder.php
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class DatabaseSeeder extends Seeder
{
public function run()
{
Model::unguard();
$this->call(UsersTableSeeder::class);
Model::reguard();
}
}
重置数据库:
php artisan migrate:refresh
填充数据:
php artisan db:seed
单独指定执行 UserTableSeeder 数据库填充文件:
php artisan migrate:refresh --seed
分页
$users = User::paginate(6);
获取用户列表之后,渲染分页链接:
{!! $users->render() !!}
由
render
方法生成的 HTML 代码默认会使用 Bootstrap 框架的样式,渲染出来的视图链接也都统一会带上 ?page 参数来设置指定页数的链接。渲染分页视图的代码必须使用 {!! !!} 语法,而不是 {{ }},这样生成 HTML 链接才不会被转义。
删除用户
生成指定 table 的迁移文件
php artisan make:migration add_is_admin_to_user_table --table=users
database/migrations/[timestamp]_add_is_admin_to_users_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->boolean('is_admin')->default(false);
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('is_admin');
});
}
};
执行数据库迁移:
php artisan migrate
模型关联
Eloquent 模型支持以下几种类型的关联:
- 一对一
- 一对多
- 多对多
- 远程一对多
- 多态关联
- 多态多对多关联
一对多
一条微博属于一个用户:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Status extends Model
{
use HasFactory;
public function user()
{
return $this->belongsTo(User::class);
}
}
一个用户拥有多条微博:
<?php
namespace App\Models;
class User extends Authenticatable
{
public function statuses()
{
return $this->hasMany(Status::class);
}
}
获取微博
public function show(User $user)
{
$statuses = $user->statuses()
->orderBy('created_at', 'desc')
->paginate(10);
return view('users.show', compact('user', 'statuses'));
}
compact
方法可以接受多个参数compact('user', 'statuses')
将用户数据$user
和$statuses
同时传递到用户个人页面的视图上。
微博页面
<li class="d-flex mt-4 mb-4">
<a class="flex-shrink-0" href="{{ route('users.show', $user->id )}}">
<img src="{{ $user->gravatar() }}" alt="{{ $user->name }}" class="me-1 gravatar"/>
</a>
<div class="flex-grow-1 ms-3">
<h5 class="mt-0 mb-1">{{ $user->name }} <small> / {{ $status->created_at->diffForHumans() }}</small></h5>
{{ $status->content }}
</div>
</li>
其中,$status
代表单条微博。
$status->created_at->diffForHumans()
该方法的作用是将日期进行友好化处理,显示结果类似 1小时前。
Carbon 是 PHP 知名的日期和时间操作扩展,
diffForHumans
是Carbon
对象提供的方法,提供了可读性越佳的日期展示形式。