Factories
Introduction
When testing your application or seeding your database, it might be necessary to insert a few records into your database beforehand. Instead of manually inputting values for each column, Goravel allows you to define a set of default attributes for each of your models by creating model factories.
To see an example of how to write a factory, you can check out the user_factory.go file located in your application's database/factories directory.
package factories
type UserFactory struct {
}
// Definition Define the model's default state.
func (f *UserFactory) Definition() map[string]any {
return map[string]any{
"Name": "Goravel",
}
}As you can see, in their most basic form, factories are structs that have a Definition method. The method returns the default set of attribute values that should be used when creating a model with the factory. To generate a range of random data, you can rely on brianvoe/gofakeit.
Generating Factories
To create a factory, run the make:factory Artisan command:
go run . artisan make:factory PostFactoryThe new factory struct will be placed in your database/factories directory.
Model & Factory Discovery Conventions
After defining a factory, you can use the Factory() method in the model to bind the factory to the model:
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{}
}Creating Models Using Factories
Instantiating Models
We can use the Make method to create models without persisting them in the database:
var user models.User
err := facades.Orm().Factory().Make(&user)You may create a collection of many models using the Count method:
var users []models.User
err := facades.Orm().Factory().Count(2).Make(&users)If you would like to override some of the default values of your models, you may pass map[string]any to the Make method. Only the specified attributes will be replaced while the rest of the attributes remain set to their default values as specified by the factory:
var user models.User
err := facades.Orm().Factory().Make(&user, map[string]any{
"Avatar": "avatar",
})Persisting Models
The Create method creates and saves model instances to the database using Orm's Save method.
var user models.User
err := facades.Orm().Factory().Create(&user)
var users []models.User
err := facades.Orm().Factory().Count(2).Create(&users)You may override the factory's default model attributes by passing map[string]any of the attributes to the Create method:
var user models.User
err := facades.Orm().Factory().Create(&user, map[string]any{
"Avatar": "avatar",
})Ignore Model Event
There may be model event defined on the model, you can ignore those events with the CreateQuietly method:
var user models.User
err := facades.Orm().Factory().CreateQuietly(&user)