慕容的工作随笔

慕容的工作随笔

记录学习和工作

【原创】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&lt;int, string&gt;
 */
protected $fillable = [
    &#039;name&#039;,
    &#039;email&#039;,
    &#039;password&#039;,
];

/**
 * The attributes that should be hidden for serialization.
 *
 * @var array&lt;int, string&gt;
 */
protected $hidden = [
    &#039;password&#039;,
    &#039;remember_token&#039;,
];

/**
 * The attributes that should be cast.
 *
 * @var array&lt;string, string&gt;
 */
protected $casts = [
    &#039;email_verified_at&#039; =&gt; &#039;datetime&#039;,
];

}

  • 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-&gt;name = &#039;Summer&#039;;
    $user-&gt;email = &#039;summer@example.com&#039;;
    $user-&gt;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-&gt;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(&#039;users&#039;, function (Blueprint $table) {
        $table-&gt;dropColumn(&#039;is_admin&#039;);
    });
}

};

执行数据库迁移:

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

评论 (0)

还没有评论,来做第一个吧。

发表评论

提交后需管理员审核通过后显示