工厂
在测试应用程序或填充数据库时,可能需要预先向数据库中插入一些记录。 Goravel允许您通过创建模型工厂为每个模型定义一组默认属性,而不是手动输入每个列的值。
要查看如何编写工厂的示例,您可以查看应用程序的database/factories
目录中的user_factory.go
文件。
go
package factories
type UserFactory struct {
}
// Definition 定义模型的默认状态。
func (f *UserFactory) Definition() map[string]any {
return map[string]any{
"Name": "Goravel",
}
}
如您所见,在最基本的形式中,工厂是具有Definition
方法的结构体。 该方法返回在使用工厂创建模型时应使用的默认属性值集。 要生成一系列随机数据,您可以依赖brianvoe/gofakeit。
生成工厂
要创建一个工厂,运行 make:factory
Artisan 命令:
go run . artisan make:factory PostFactory
新的工厂 struct
将被放置在你的 database/factories
目录中。
模型和工厂发现约定
定义工厂后,你可以在模型中使用 Factory()
方法将工厂绑定到模型:
go
package models
import (
"github.com/goravel/framework/contracts/database/factory"
"github.com/goravel/framework/database/orm"
"goravel/database/factories"
)
type User struct {
orm.Model
Name string
Avatar string
orm.SoftDeletes
}
func (u *User) Factory() factory.Factory {
return &factories.UserFactory{}
}
使用工厂创建模型
实例化模型
我们可以使用 Make
方法创建模型而不将它们持久化到数据库中:
go
var user models.User
err := facades.Orm().Factory().Make(&user)
你可以使用 Count
方法创建多个模型的集合:
go
var users []models.User
err := facades.Orm().Factory().Count(2).Make(&users)
如果你想覆盖模型的一些默认值,你可以将 map[string]any
传递给 Make
方法。 只有指定的属性会被替换,而其他属性将保持工厂指定的默认值:
go
var user models.User
err := facades.Orm().Factory().Make(&user, map[string]any{
"Avatar": "avatar",
})
持久化模型
Create
方法使用 Orm 的 Save
方法创建并保存模型实例到数据库。
go
var user models.User
err := facades.Orm().Factory().Create(&user)
var users []models.User
err := facades.Orm().Factory().Count(2).Create(&users)
你可以通过将 map[string]any
属性传递给 Create
方法来覆盖工厂的默认模型属性:
go
var user models.User
err := facades.Orm().Factory().Create(&user, map[string]any{
"Avatar": "avatar",
})
忽略模型事件
模型上可能定义了模型事件,你可以使用CreateQuietly
方法忽略这些事件:
go
var user models.User
err := facades.Orm().Factory().CreateQuietly(&user)