使用 Laravel 中的工厂为枢轴 table 播种
Seed a pivot table using factories in Laravel
我是 Laravel 的新手,我正在寻找使用 factories 播种枢轴 table 的好方法。我不想使用普通播种机。我给你看案例:
我有三个 table(用户、技能和user_skill ).
users user_skill skills
+----------------+ +----------------------+ +-----------------+
| id | name | | user_id | section_id | | id | skills |
+----------------+ +----------------------+ +-----------------+
| 1 | Alex | | | | | 1 | draw |
|----------------| |----------------------| |-----------------|
| 2 | Lucy | | | | | 2 | program |
|----------------| |----------------------| |-----------------|
| 3 | Max | | | | | 3 | social |
|----------------| |----------------------| +-----------------+
| 4 | Sam | | | |
+----------------+ +----------------------+
有没有什么好的方法可以让用户 table 的真实 Id
和技能 table 的真实 Id
成为关键点 table?我想随机进行,但我不想要与任何 id 都不匹配的随机数。我希望 ID 与 users 和 skills.
匹配
我不知道如何开始,我正在寻找一个很好的例子。也许是这样的?
$factory->defineAs(App\User::class, 'userSkills', function ($faker) {
return [
'user_id' => ..?
'skills_id' => ..?
];
});
我认为这不是最好的方法,但它对我有用。
$factory->define(App\UserSkill::class, function (Faker\Generator $faker) {
return [
'user_id' => factory(App\User::class)->create()->id,
'skill_id' => factory(App\Skill::class)->create()->id,
];
});
如果您不想只为枢轴创建模型 table,您可以手动插入它。
DB::table('user_skill')->insert(
[
'user_id' => factory(App\User::class)->create()->id,
'skill_id' => factory(App\Skill::class)->create()->id,
]
);
或者,使用随机现有值。
DB::table('user_skill')->insert(
[
'user_id' => User::select('id')->orderByRaw("RAND()")->first()->id,
'skill_id' => Skill::select('id')->orderByRaw("RAND()")->first()->id,
]
);
我遇到了类似的问题,我在 Laravel 测试中以这种方式解决了。
不需要创建新的 UserSkills 模型:
版本Laravel 5.7
数据库
users user_skill skills
+----------------+ +------------------------------------+ +-----------------+
| id | name | | user_id | section_id | state_skill | | id | skills |
+----------------+ +------------------------------------+ +-----------------+
| 1 | Alex | | | | | | 1 | draw |
|----------------| |----------------------|-------------| |-----------------|
| 2 | Lucy | | | | | | 2 | program |
|----------------| |----------------------|-------------| |-----------------|
| 3 | Max | | | | | | 3 | social |
|----------------| |----------------------|-------------| +-----------------+
| 4 | Sam | | | | |
+----------------+ +----------------------+-------------+
User.php
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Authenticatable
{
use Notifiable;
use SoftDeletes;
public function skills()
{
return $this->belongsToMany('App\Skill')
->withTimestamps()
->withPivot('state_skill');
}
}
DataBaseTest.php
<?php
namespace Tests\Unit;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Schema;
class DataBaseTest extends TestCase
{
/**
* @test
*/
public function test_create_user_skill()
{
// Create DataBase
$users = factory(\App\User::class, 1)
->create()
->each(function ($user) {
// Create Models Support
$skill = factory(\App\Skill::class)->create();
// Create Pivot with Parameters
$user->skills()->attach($skill->id,[
'state_skill' => 'ok'
]);
});
// Testing
// ...
$this->assertTrue(true);
}
}
对于正在使用 laravel 8.x 并且正在寻找此类问题的解决方案的用户;
在 laravel 8.x 中,您可以使用 Magic Methods 喂养您的枢轴,
例如,如果您在用户模型中有一个名为“userSkills”的 belongsToMany 关系,您应该以这种方式提供枢轴 table:
User::factory()->hasUserSkills(1, ['skills' => 'draw'])->create();
我是 Laravel 的新手,我正在寻找使用 factories 播种枢轴 table 的好方法。我不想使用普通播种机。我给你看案例:
我有三个 table(用户、技能和user_skill ).
users user_skill skills
+----------------+ +----------------------+ +-----------------+
| id | name | | user_id | section_id | | id | skills |
+----------------+ +----------------------+ +-----------------+
| 1 | Alex | | | | | 1 | draw |
|----------------| |----------------------| |-----------------|
| 2 | Lucy | | | | | 2 | program |
|----------------| |----------------------| |-----------------|
| 3 | Max | | | | | 3 | social |
|----------------| |----------------------| +-----------------+
| 4 | Sam | | | |
+----------------+ +----------------------+
有没有什么好的方法可以让用户 table 的真实 Id
和技能 table 的真实 Id
成为关键点 table?我想随机进行,但我不想要与任何 id 都不匹配的随机数。我希望 ID 与 users 和 skills.
我不知道如何开始,我正在寻找一个很好的例子。也许是这样的?
$factory->defineAs(App\User::class, 'userSkills', function ($faker) {
return [
'user_id' => ..?
'skills_id' => ..?
];
});
我认为这不是最好的方法,但它对我有用。
$factory->define(App\UserSkill::class, function (Faker\Generator $faker) {
return [
'user_id' => factory(App\User::class)->create()->id,
'skill_id' => factory(App\Skill::class)->create()->id,
];
});
如果您不想只为枢轴创建模型 table,您可以手动插入它。
DB::table('user_skill')->insert(
[
'user_id' => factory(App\User::class)->create()->id,
'skill_id' => factory(App\Skill::class)->create()->id,
]
);
或者,使用随机现有值。
DB::table('user_skill')->insert(
[
'user_id' => User::select('id')->orderByRaw("RAND()")->first()->id,
'skill_id' => Skill::select('id')->orderByRaw("RAND()")->first()->id,
]
);
我遇到了类似的问题,我在 Laravel 测试中以这种方式解决了。
不需要创建新的 UserSkills 模型:
版本Laravel 5.7
数据库
users user_skill skills
+----------------+ +------------------------------------+ +-----------------+
| id | name | | user_id | section_id | state_skill | | id | skills |
+----------------+ +------------------------------------+ +-----------------+
| 1 | Alex | | | | | | 1 | draw |
|----------------| |----------------------|-------------| |-----------------|
| 2 | Lucy | | | | | | 2 | program |
|----------------| |----------------------|-------------| |-----------------|
| 3 | Max | | | | | | 3 | social |
|----------------| |----------------------|-------------| +-----------------+
| 4 | Sam | | | | |
+----------------+ +----------------------+-------------+
User.php
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Authenticatable
{
use Notifiable;
use SoftDeletes;
public function skills()
{
return $this->belongsToMany('App\Skill')
->withTimestamps()
->withPivot('state_skill');
}
}
DataBaseTest.php
<?php
namespace Tests\Unit;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Schema;
class DataBaseTest extends TestCase
{
/**
* @test
*/
public function test_create_user_skill()
{
// Create DataBase
$users = factory(\App\User::class, 1)
->create()
->each(function ($user) {
// Create Models Support
$skill = factory(\App\Skill::class)->create();
// Create Pivot with Parameters
$user->skills()->attach($skill->id,[
'state_skill' => 'ok'
]);
});
// Testing
// ...
$this->assertTrue(true);
}
}
对于正在使用 laravel 8.x 并且正在寻找此类问题的解决方案的用户;
在 laravel 8.x 中,您可以使用 Magic Methods 喂养您的枢轴, 例如,如果您在用户模型中有一个名为“userSkills”的 belongsToMany 关系,您应该以这种方式提供枢轴 table:
User::factory()->hasUserSkills(1, ['skills' => 'draw'])->create();