Laravel: таблица базы данных заполнения с отношением Когда таблица имеет два внешних ключа

Я использую заводской метод 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

Код для вызова factory приведен ниже:

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 разных пользователя. Итак, какой дополнительный код я должен добавить в вышеуказанный метод для достижения этой цели.


person Milan Budhathoki    schedule 15.06.2020    source источник


Ответы (1)


У меня есть простой метод приближения, который вы можете рассмотреть

//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]);
        }
    });
});

Надеюсь, это поможет

person ThienHuynh    schedule 15.06.2020
comment
Единственное, что мне нужно сделать, это определить переменную массива глобально, иначе в каждой функции будет указано неопределенная переменная. А в прочем все работает нормально. Спасибо большое. - person Milan Budhathoki; 15.06.2020
comment
Да, спасибо, я забыл использовать use() для передачи параметра в функцию обратного вызова. я обновлю свой ответ - person ThienHuynh; 16.06.2020