【原创】Laravel中的模型

模型文件

默认生成的模型文件

<?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 知名的日期和时间操作扩展, diffForHumansCarbon 对象提供的方法,提供了可读性越佳的日期展示形式。

点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注