Laravel模型创建通过php artisan make:model生成骨架文件,结合save()、create()、firstOrCreate()等方法实现数据持久化,配合$fillable安全控制与模型配置如表名、主键、连接等,灵活应对不同场景的数据操作需求。

Laravel模型创建主要是通过Artisan命令
php artisan make:model
save()
create()
firstOrCreate()
创建Laravel模型通常从命令行开始,这就像是搭好了房子的大致框架。当你执行
php artisan make:model Post
app/Models
Post.php
posts
Post
posts
生成模型时,你还可以带上一些参数,比如
php artisan make:model Post -m
-c
-r
php artisan make:model Post --all
--all
模型文件本身,一开始会很简洁:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
}
但要让它真正工作起来,尤其是在执行数据创建操作时,你需要关注几个关键属性,比如
$fillable
$guarded
接下来,数据创建操作才是真正把数据塞进数据库的步骤,这里有几种常见方式:
实例化模型,赋值,然后保存: 这是最基础也是最直观的方式。你先创建一个模型的新实例,然后逐个给它的属性赋值,最后调用
save()
use App\Models\Post; $post = new Post; $post->title = '我的第一篇文章'; $post->content = '这是文章的具体内容,通过逐个赋值的方式添加。'; $post->user_id = 1; // 假设关联用户ID $post->save();
这种方式的好处在于,你在
save()
使用 create()
create()
use App\Models\Post;
$post = Post::create([
'title' => '又一篇新文章,这次用create方法',
'content' => '批量赋值真是方便快捷。',
'user_id' => 2,
]);但这里有个大前提:你的模型必须正确设置了
$fillable
$guarded
MassAssignmentException
firstOrCreate()
use App\Models\Category;
$category = Category::firstOrCreate(
['name' => '编程'], // 用于查找的属性
['slug' => 'programming'] // 如果创建,额外添加的属性
);这对于需要确保某条记录(比如一个标签、一个分类)唯一存在,避免重复创建的场景特别有用。
firstOrNew()
firstOrCreate()
save()
use App\Models\Tag;
$tag = Tag::firstOrNew(
['name' => 'Laravel'],
['description' => 'PHP框架']
);
if (!$tag->exists) {
// 可以在保存前做一些额外操作
$tag->created_by = auth()->id();
}
$tag->save();firstOrNew()
updateOrCreate()
use App\Models\Setting;
$setting = Setting::updateOrCreate(
['key' => 'app_name'], // 用于查找的属性
['value' => '我的新应用名称', 'description' => '应用的名称设置'] // 用于更新或创建的属性
);这对于需要“如果存在就更新,不存在就创建”的场景非常高效,比如用户配置、系统设置等。
在Laravel中进行数据创建时,批量赋值(Mass Assignment)是一个非常重要的安全考量点。如果处理不当,可能导致严重的安全漏洞。简单来说,批量赋值漏洞就是攻击者通过提交额外的或恶意的字段,来修改数据库中他们本不应该修改的属性。
想象一下,你的用户注册表单只接收
name
is_admin=true
User::create($request->all())
Laravel通过模型中的
$fillable
$guarded
$fillable
create()
update()
// app/Models/Post.php
class Post extends Model
{
use HasFactory;
protected $fillable = [
'title',
'content',
'user_id',
// ... 其他允许批量赋值的字段
];
}这样做的好处是“白名单”机制,默认是拒绝的,你需要显式地允许。这大大降低了因为疏忽而引入安全漏洞的风险。
$guarded
$fillable
$guarded
// app/Models/User.php
class User extends Model
{
use HasFactory;
protected $guarded = [
'id',
'is_admin',
// ... 其他不允许批量赋值的字段
];
}虽然它也能起到作用,但我个人认为
$guarded
$fillable
如果你设置
protected $guarded = [];
在实际开发中,始终坚持使用
$fillable
Seeder
$guarded
forceFill()
$user = User::forceCreate([
'name' => 'Admin User',
'email' => 'admin@example.com',
'password' => bcrypt('password'),
'is_admin' => true, // 即使 is_admin 在 $guarded 中,这里也会被赋值
]);forceCreate()
forceFill()
$fillable
$guarded
模型创建后,Laravel的Eloquent ORM会自动尝试根据模型名来推断对应的数据库表、主键、时间戳等信息。但实际情况往往更复杂,你的数据库表名可能不遵循约定,或者主键不是默认的
id
自定义表名:$table
Post
posts
User
users
$table
class MyCustomPost extends Model
{
protected $table = 'blog_posts'; // 告诉Eloquent,这个模型对应的是 'blog_posts' 表
}这个配置非常常用,我经常遇到需要调整表名的情况。
自定义主键:$primaryKey
id
id
$primaryKey
class Product extends Model
{
protected $primaryKey = 'product_id'; // 假设主键是 'product_id'
}非自增主键:$incrementing
$incrementing
false
class UuidModel extends Model
{
protected $primaryKey = 'uuid';
public $incrementing = false; // 告知Eloquent主键不是自增的
protected $keyType = 'string'; // 如果主键是UUID,通常是字符串类型
}注意,当主键不是自增时,通常它的类型也不是整数,所以还需要设置
$keyType
自定义主键类型:$keyType
$keyType
class UserToken extends Model
{
protected $primaryKey = 'token_string';
public $incrementing = false;
protected $keyType = 'string'; // 主键是字符串类型
}禁用时间戳:$timestamps
created_at
updated_at
$timestamps
false
class SimpleLookup extends Model
{
public $timestamps = false; // 禁用时间戳
}这在一些简单的查找表或枢纽表(pivot table)中很常见。
自定义时间戳字段名:created_at
updated_at
created_at
updated_at
class CustomTimestampModel extends Model
{
const CREATED_AT = 'creation_date';
const UPDATED_AT = 'last_update_time';
}指定数据库连接:$connection
$connection
class ExternalData extends Model
{
protected $connection = 'mysql_secondary'; // 使用 'mysql_secondary' 数据库连接
}这在处理多租户应用或与外部数据源集成时非常有用。
这些配置提供了极大的灵活性,让Eloquent能够适应各种复杂的数据库结构和命名约定。在我自己的项目中,尤其是在处理旧系统或第三方数据时,这些配置几乎是不可或缺的。它们让Eloquent在保持强大功能的同时,也能保持高度的适应性。
save()
create()
firstOrCreate()
在实际开发中,选择哪种数据创建方法,并非哪个“更好”的问题,而是哪个“更适合当前场景”的问题
以上就是Laravel模型创建?创建操作如何执行?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号