2

我正在使用 laravel 工厂方法来填充我的数据库表。我有三个模型,它们之间的关系如下:

   **User model**

class User extends Authenticatable
{
    public function books() {
        return $this->hasMany('App\Book', 'user_id', 'id');
    }

    public function ratings() {
        return $this->hasMany('App\Rating', 'user_id', 'id');
    }
}


    **Book Model**

    class Book extends Model
{
    public function user() {
        return $this->belongsTo('App\User', 'user_id', 'id');
    }

    public function ratings() {
        return $this->hasMany('App\Rating', 'book_id', 'id');
    }

 **Rating Model**

class Rating extends Model
{

    public function book() {
        return $this->belongsTo('App\Book', 'book_id', 'id');
    }
    public function user() {
        return $this->belongsTo('App\User', 'user_id', 'id');
    }
}

我对模型 Book 和 Rating 的工厂定义如下所示:

$factory->define(Book::class, function (Faker $faker) {
    return [
        'title' => $faker->title,
        'description' => $faker->sentence
    ];
});

$factory->define(Rating::class, function (Faker $faker) {
    return [
        'rating' => $faker->numberBetween(1,5)
    ];
});

数据库表如下所示:

用户表:

id,name,email,password

书台:

id,user_id,title,description

评分表:

id,user_id,book_id,rating

调用工厂的代码如下:

public function run()
    {   
        //create 10 users
        $user = factory(App\User::class,10)->create();

        // create 2 books for each user
        $user->each(function ($user) {
            $book = $user->books()->saveMany(factory(App\Book::class,2)->make());
            });

        });

所以通过这种运行方法,我可以创建 10 个用户,每个用户有两本书。但我也想让每本书由 3 个不同的用户评分。那么我应该在上面的方法中添加什么额外的代码来实现这一点。

4

1 回答 1

2

我有一个简单的接近方法,你可以考虑

//create 10 users
$user = factory(App\User::class,10)->create();
$id_arr = Arr::pluck($user , 'id'); // get user id array

// create 2 books for each user
$user->each(function ($user) use($id_arr) {
    $books = $user->books()->saveMany(factory(App\Book::class,2)->make());
    $shuffle_id = Arr::shuffle($id_arr); // shuffle user_id each time create user successfully
    // add 3 rates for each book with different user
    $books->each(function ($book) use($shuffle_id) {
        $book_id = $book['id'];
        for ($i=0; $i<3; $i++){
            $user_id = $shuffle_id[$i]; // get id in first 3 of shuffle_id array (this will make sure, user_id will never be duplicated
            factory(App\Rate::class)->create(['book_id'=>$book_id, 'user_id' => $user_id]);
        }
    });
});

希望它会有所帮助

于 2020-06-15T06:49:12.480 回答