Php Laravel(5.6)如何为与其他表相关的表设置种子

Php Laravel(5.6)如何为与其他表相关的表设置种子,php,laravel,Php,Laravel,目前有一些停机时间,我想我应该和laravel一起玩,因为我通常只在基本web开发中使用它 我尝试过播种机,喜欢将测试数据放入表中更快,但我不确定如何对具有关系的多个表执行此操作 在我的例子中,假设我有3个表,一个客户表,一个客户地址表和一个客户购买表 播种customer表很容易,因为它是主表,但其他两个表有一个名为customer_id的列,该列是对customer表的引用 如果我想使用seeders,我应该如何编写代码来创建X数量的客户,然后在其他表中创建以下记录,这些表链接回创建的客户

目前有一些停机时间,我想我应该和laravel一起玩,因为我通常只在基本web开发中使用它

我尝试过播种机,喜欢将测试数据放入表中更快,但我不确定如何对具有关系的多个表执行此操作

在我的例子中,假设我有3个表,一个客户表,一个客户地址表和一个客户购买表

播种customer表很容易,因为它是主表,但其他两个表有一个名为customer_id的列,该列是对customer表的引用

如果我想使用seeders,我应该如何编写代码来创建X数量的客户,然后在其他表中创建以下记录,这些表链接回创建的客户

如果我遗漏了文档中的某些内容,请道歉。

您可以简单地做一个foreach声明

$customers = factory(Customer::class,N)->create();
foreach( $customers as $customer)
{
     factory(CustomerAddress::class)->create([
          'customer_id' => $customer->id
     ]);

     factory(CustomerPurchase::class)->create([
          'customer_id' => $customer->id
     ]);
}
注意:仅当您希望为每位客户提供地址和购买信息时,才建议这样做。 否则,您应该以不同的方式对待播种,而不是为每个客户提供地址和购买信息。 这会降低测试的可靠性

您可以简单地做一个foreach语句

$customers = factory(Customer::class,N)->create();
foreach( $customers as $customer)
{
     factory(CustomerAddress::class)->create([
          'customer_id' => $customer->id
     ]);

     factory(CustomerPurchase::class)->create([
          'customer_id' => $customer->id
     ]);
}
注意:仅当您希望为每位客户提供地址和购买信息时,才建议这样做。 否则,您应该以不同的方式对待播种,而不是为每个客户提供地址和购买信息。
这会降低测试的可靠性

文档中的一些修改代码:

$users = factory(Customer::class, 3)
       ->create()
       ->each(function ($u) {
            $u->addresses()->save(factory(Address::class)->make());
            $u->purchases()->saveMany(factory(Purchase::class, 10)->make());
        });

文档中的一些修改代码:

$users = factory(Customer::class, 3)
       ->create()
       ->each(function ($u) {
            $u->addresses()->save(factory(Address::class)->make());
            $u->purchases()->saveMany(factory(Purchase::class, 10)->make());
        });

首先,您需要在客户模型上设置。我假设客户模型与CustomerAddress和CustomerPurchase模型有关系

接下来,您需要定义一个

现在,您所要做的就是使用这些模型工厂在数据库中播种随机记录。您仍然可以使用雄辩的收藏,而且很好:

<?php

// database/seed/DatabaseSeeder.php
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(App\Customer::class, 10)->create()->each(function ($customer) {
            $customerAddresses = factory(App\CustomerAddress::class, 2)->make();
            $customerPurchases = factory(App\CustomerPurchase::class, 5)->make();

            $customer->addresses()->saveMany($customerAddresses);
            $customer->purchases()->saveMany($customerPurchases);
        });
    }
}

希望这能给您一些想法。

首先,您需要在客户模型上设置。我假设客户模型与CustomerAddress和CustomerPurchase模型有关系

接下来,您需要定义一个

现在,您所要做的就是使用这些模型工厂在数据库中播种随机记录。您仍然可以使用雄辩的收藏,而且很好:

<?php

// database/seed/DatabaseSeeder.php
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(App\Customer::class, 10)->create()->each(function ($customer) {
            $customerAddresses = factory(App\CustomerAddress::class, 2)->make();
            $customerPurchases = factory(App\CustomerPurchase::class, 5)->make();

            $customer->addresses()->saveMany($customerAddresses);
            $customer->purchases()->saveMany($customerPurchases);
        });
    }
}

希望这能给你一些想法。

向下滚动到Relationships谢谢我会阅读,我更喜欢看第一眼而不阅读:-向下滚动到Relationships谢谢我会阅读,我更多的是建立在第一印象的基础上,而不是阅读:-是的,我想过为每个人制作一个,并用faker模拟数据,但认为必须有一种合理的方法来做,如何在工厂内使用变量“customer_id”?是的,我想过为每个人制作一个,并用faker模拟数据,但认为必须有一种合理的方法i如何在工厂内使用变量“customer\u id”?迄今为止的最佳解决方案。迄今为止的最佳解决方案。