Factory Seed pivot table in Laravel 具有多对多关系
Factory Seed pivot table in Laravel with many-to-many relationships
我对工厂和种子完全陌生,直到现在我一直在手动向 Sequel Pro 或 Workbench an.
中的每个项目添加数据
总的来说,我对 Laravel 还很陌生,但我认为我已经正确设置了模型。
我有一个食谱可以有多个配料,并且配料可以属于多个食谱。
两者之间的主元有数量和单位列(后者可为空)。
Recipe.php
class Recipe extends Model
{
public function user(){
return $this->belongsTo('App\User');
}
public function ingredients(){
return $this->belongsToMany('App\Ingredient');
}
}
Ingredient.php
class Ingredient extends Model
{
public function recipes(){
return $this->belongsToMany('App\Recipe');
}
}
IngredientFactory.php
$factory->define(App\Ingredient::class, function (Faker $faker) {
return [
'name' => $faker->word,
'created_at' => Carbon::now()->format('Y-m-d H:i:s'),
'updated_at' => Carbon::now()->format('Y-m-d H:i:s'),
];
});
RecipeFactory.php
$factory->define(App\Recipe::class, function (Faker $faker) {
$userIds = User::all()->pluck('id')->toArray();
return [
'title' => $faker->text(30),
'description' => $faker->text(200),
'user_id' => $faker->randomElement($userIds),
'created_at' => Carbon::now()->format('Y-m-d H:i:s'),
'updated_at' => Carbon::now()->format('Y-m-d H:i:s'),
];
});
IngredientTableSeeder
public function run()
{
factory(App\Ingredient::class, 100)->create();
}
RecipeTableSeeder
public function run()
{
factory(App\Recipe::class, 30)->create();
}
一切正常,但我正在尝试找出如何为枢轴生成数据 table。
我觉得应该是这样的:
RecipeIngredientsFactory.php
$factory->define(?::class, function (Faker $faker) {
$recipeIds = Recipe::all()->pluck('id')->toArray();
$ingredientIds = Ingredient::all()->pluck('id')->toArray();
return [
'recipe_id' => $faker->randomElement($recipeIds),
'ingredient_id' => $faker->randomElement($ingredientIds),
];
});
但我不确定要为 model::class
添加什么作为 ?
?
我可能完全没有根据,但逻辑似乎是正确的。
如果需要更多信息,请在评论中告诉我。
一般来说,您定义的映射 table 提供了配方与其成分之间的 link。从非常简单的角度来看,在很多多对多关系中,您不会有 link 的模型,因为该关系除了 linkage 之外没有任何意义。在这种情况下,您可以像这样构建一个 Recipe Seeder:
public function run()
{
$recipes = factory(App\Recipe::class, 30)->create();
$ingredients = factory(App\Ingredient::class, 20)->create();
$recipes->each(function (App\Recipe $r) use ($ingredients) {
$r->ingredients()->attach(
$ingredients->random(rand(5, 10))->pluck('id')->toArray(),
['grams' => 5]
);
});
}
这将独立生成食谱和配料,然后您只需以标准方式关联它们即可。您还可以在不同的播种机中分别生成它们,并让第三个播种机进行连接。
在您的具体情况下,您将加入 Recipes and Ingredients。对应关系会有自己的属性,比如你的食谱需要多少克的配料。在这种情况下,您可能会发现连接模型很有用。查看 定义自定义中间体 Table 模型.
部分下的 https://laravel.com/docs/5.7/eloquent-relationships#many-to-many
我对工厂和种子完全陌生,直到现在我一直在手动向 Sequel Pro 或 Workbench an.
中的每个项目添加数据总的来说,我对 Laravel 还很陌生,但我认为我已经正确设置了模型。
我有一个食谱可以有多个配料,并且配料可以属于多个食谱。
两者之间的主元有数量和单位列(后者可为空)。
Recipe.php
class Recipe extends Model
{
public function user(){
return $this->belongsTo('App\User');
}
public function ingredients(){
return $this->belongsToMany('App\Ingredient');
}
}
Ingredient.php
class Ingredient extends Model
{
public function recipes(){
return $this->belongsToMany('App\Recipe');
}
}
IngredientFactory.php
$factory->define(App\Ingredient::class, function (Faker $faker) {
return [
'name' => $faker->word,
'created_at' => Carbon::now()->format('Y-m-d H:i:s'),
'updated_at' => Carbon::now()->format('Y-m-d H:i:s'),
];
});
RecipeFactory.php
$factory->define(App\Recipe::class, function (Faker $faker) {
$userIds = User::all()->pluck('id')->toArray();
return [
'title' => $faker->text(30),
'description' => $faker->text(200),
'user_id' => $faker->randomElement($userIds),
'created_at' => Carbon::now()->format('Y-m-d H:i:s'),
'updated_at' => Carbon::now()->format('Y-m-d H:i:s'),
];
});
IngredientTableSeeder
public function run()
{
factory(App\Ingredient::class, 100)->create();
}
RecipeTableSeeder
public function run()
{
factory(App\Recipe::class, 30)->create();
}
一切正常,但我正在尝试找出如何为枢轴生成数据 table。
我觉得应该是这样的:
RecipeIngredientsFactory.php
$factory->define(?::class, function (Faker $faker) {
$recipeIds = Recipe::all()->pluck('id')->toArray();
$ingredientIds = Ingredient::all()->pluck('id')->toArray();
return [
'recipe_id' => $faker->randomElement($recipeIds),
'ingredient_id' => $faker->randomElement($ingredientIds),
];
});
但我不确定要为 model::class
添加什么作为 ?
?
我可能完全没有根据,但逻辑似乎是正确的。
如果需要更多信息,请在评论中告诉我。
一般来说,您定义的映射 table 提供了配方与其成分之间的 link。从非常简单的角度来看,在很多多对多关系中,您不会有 link 的模型,因为该关系除了 linkage 之外没有任何意义。在这种情况下,您可以像这样构建一个 Recipe Seeder:
public function run()
{
$recipes = factory(App\Recipe::class, 30)->create();
$ingredients = factory(App\Ingredient::class, 20)->create();
$recipes->each(function (App\Recipe $r) use ($ingredients) {
$r->ingredients()->attach(
$ingredients->random(rand(5, 10))->pluck('id')->toArray(),
['grams' => 5]
);
});
}
这将独立生成食谱和配料,然后您只需以标准方式关联它们即可。您还可以在不同的播种机中分别生成它们,并让第三个播种机进行连接。
在您的具体情况下,您将加入 Recipes and Ingredients。对应关系会有自己的属性,比如你的食谱需要多少克的配料。在这种情况下,您可能会发现连接模型很有用。查看 定义自定义中间体 Table 模型.
部分下的 https://laravel.com/docs/5.7/eloquent-relationships#many-to-many