【原创】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 对象提供的方法,提供了可读性越佳的日期展示形式。

点赞
  1. HighRollerMage说道:
    Google Chrome Windows 10
    https://t.me/s/IZZI_officials
  2. AllInAce说道:
    Google Chrome Windows 10
    https://t.me/kazino_s_minimalnym_depozitom/19
  3. RouletteRogue说道:
    Google Chrome Windows 10
    В лабиринте азарта, где каждый ресурс стремится заманить обещаниями простых выигрышей, рейтинг топ 10 онлайн казино становится как раз той ориентиром, что ведет мимо дебри подвохов. Игрокам профи и дебютантов, кто надоел из-за фальшивых посулов, такой помощник, чтобы почувствовать реальную rtp, будто ощущение золотой фишки в ладони. Без лишней болтовни, лишь проверенные клубы, в которых rtp не лишь цифра, а конкретная везение.Составлено по гугловых поисков, будто сеть, что ловит наиболее свежие тенденции на сети. Здесь отсутствует роли для клише приёмов, каждый элемент как ставка в игре, где обман проявляется немедленно. Профи видят: в стране манера письма на сарказмом, в котором юмор скрывается словно рекомендацию, позволяет миновать обмана.На www.don8play.ru/ данный рейтинг находится будто открытая карта, готовый для старту. Зайди, коли нужно почувствовать ритм реальной игры, обходя мифов да неудач. Для тех ценит ощущение выигрыша, такое будто взять фишки на пальцах, а не смотреть по монитор.

发表回复

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