Laravel 入门:08-模型设置

Laravel 模型中指定数据库连接(protected $connection)、数据表名称( protected $table)、主键(protected $primaryKey)、主键类型(protected $keyType),时间戳(protected $timestamps)、fillable、hidden

hefengbao 发布于 2022.12.16 ,最后更新于 2023.09.18

一、数据库连接

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

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

二、数据表名称

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

class Post extends Model
{
    protected $table = 'posts';
}

三、主键

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

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

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

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

class Post extends Model
{
    protected $primaryKey = 'uuid'; 
}

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

class Post extends Model
{
    protected $incrementing = false; 
}

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

class Post extends Model
{
    protected $keyType= 'string'; 
}

四、时间戳

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

class Post extends Model
{
    protected $timestamps = false; 
}

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

class Post extends Model
{
    const CREATED_AT = 'creation_date';
    const UPDATED_AT = 'updated_date';
}

五、fillable,hidden

可以查看默认的 User 模型:

class User extends Authenticatable
{
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

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

先举个例子:

<?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 的作用,指定那些属性可以批量赋值。

<?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 查看结果:

{
  "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    Laravel   Laravel 入门  

hefengbao

暂无个人简介

有0条评论

发表评论

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

来源:

https://www.8ug.icu/articles/laravel-tutorial-08-model-settings-XZY0M90j3Q