【问题标题】:Seeding to populate a table with mandatory and random data播种以使用强制性和随机数据填充表
【发布时间】:2022-01-27 19:11:33
【问题描述】:

目标是用强制性和随机菜单项填充表格。

以下情况仅适用于随机项目

父表

$parents = [
   ['id' => 1, 'parent' => 'AA'],
   ['id' => 2, 'parent' => 'BB'],
   ['id' => 3, 'parent' => 'CC'],
];

填充菜单表

$menus = [
   ['id' => 1, 'menu' => 'A'],
   ['id' => 2, 'menu' => 'B'],
   ['id' => 3, 'menu' => 'C'],
   ['id' => 4, 'menu' => 'D'],
   ['id' => 5, 'menu' => 'E'],
];

foreach ($menus as $menu) {
   modelMenu::updateOrCreate([ 'id' => $menu['id']], $menu);
}

关系

    $menus = Menu::all();

    Parent::all()->each(function ($parent) use ($menus) { 
        $parent->menus()->attach(
            $menus->random(rand(1, 5))->pluck('id')->toArray()
        ); 
    });

模型

class Parent extends Model
{
   protected $fillable = ['parents'];

   public function menus()
   {
     return $this->hasMany(Menu::class);
   }
}

 class Menu extends Model
 {
  protected $fillable = ['menus'];

  public function parents()
  {
    return $this->belongsTo(Parent::class);
  }
}

我打算实现的是每个父级必须有相关的 ids 1 和 2 菜单;

菜单 3、4 和 5 随机添加。

例子:

Parent AA - menus with ids 1, 2, 5; 
Parent BB - menus with ids 1, 2, 4, 6;
Parent CC - menus with ids 1, 2, 3;

【问题讨论】:

  • 播种应由工厂和播种机完成。为您的代码添加一些上下文以显示它在哪里以及它是如何运行的。
  • 我通常使用工厂和播种机,但这是一个非常特殊的情况,只使用播种。我将编辑我的帖子以提供更多信息。

标签: laravel seeding


【解决方案1】:

这应该会达到您想要的结果:


$menus = Menu::all()->values();

Parent::all()->each(function ($parent) use ($menus) { 
    $parent->menus()->attach([
        $menus->get(0)->id, 
        $menus->get(1)->id, 
        ...$menus->whereNotIn('id', [1,2])->random(rand(1, 5))->pluck('id')
    ]); 
});


values() 方法返回带有键的新集合,您可以利用 get(index) 获取第一和第二条记录,其余的基本上是随机记录,whereNotIn('id', [1,2]) 跳过具有 ids [1, 2]。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 2013-09-24
    • 2013-03-14
    • 2018-12-08
    相关资源
    最近更新 更多