如何在拥有Laravel的工厂内使用工厂?

如何在拥有Laravel的工厂内使用工厂?,laravel,testing,Laravel,Testing,我有一个创建StreetAddress的工厂,我想在创建信用卡的工厂中使用它 好:这与预期一样,为street_地址创建一个带有stdClass的CreditCard对象,并且属性都很好 <?php use FuquIo\LaravelAccounting\Orm\CreditCard; use FuquIo\LaravelCommonRelatables\Locatable\StreetAddress; use FuquIo\LaravelUser\Access\User; $fact

我有一个创建StreetAddress的工厂,我想在创建信用卡的工厂中使用它

好:这与预期一样,为street_地址创建一个带有stdClass的CreditCard对象,并且属性都很好

<?php
use FuquIo\LaravelAccounting\Orm\CreditCard;
use FuquIo\LaravelCommonRelatables\Locatable\StreetAddress;
use FuquIo\LaravelUser\Access\User;

$factory->define(CreditCard::class, function (\Faker\Generator $faker){

$street_address = factory(StreetAddress::class)->make();

return [
    'customer_id'    => User::root()->getKey(),
    'cardholder'     => $faker->firstName . ' ' . $faker->lastName,
    'nick_name'      => $faker->company,
    // LOOK HERE: this works
    'street_address' => function () use ($street_address) { return (object) $street_address->toArray(); }
];

});

仅供参考:当我单步执行时,调试器会在所有情况下显示正确的类。

假设您也有一个用于
StreetAddress的工厂,那么您应该能够执行以下操作:

$factory->define(CreditCard::class, function (\Faker\Generator $faker){    
    return [
        'cardholder'     => $faker->firstName . ' ' . $faker->lastName,
        'nick_name'      => $faker->company,
        'street_address' => function () {
            return factory(App\StreetAddress::class)->create()->toArray();
        }
    ];
});

这提出了一个有趣的观点。create()vs make()如果我要嵌套工厂,我需要小心create()用伪造数据填充数据库。@TarekAdam如果工厂用于单元测试,那么它可以包装在数据库事务中并回滚,因此不会保存任何记录。Ben的观点很好。Laravel有一个很好的单元测试特性,所以你只需要
使用DatabaseTransactions
use FuquIo\LaravelAccounting\Orm\CreditCard;
use FuquIo\LaravelCommonRelatables\Locatable\StreetAddress;


$factory->define(CreditCard::class, function (\Faker\Generator $faker){

//$street_address = factory(StreetAddress::class)->make();

return [
    'cardholder'     => $faker->firstName . ' ' . $faker->lastName,
    'nick_name'      => $faker->company,
//  'street_address' => function () use ($street_address) { return (object) $street_address->toArray(); }
    'street_address' => factory(StreetAddress::class)->make()
];

});
$factory->define(CreditCard::class, function (\Faker\Generator $faker){    
    return [
        'cardholder'     => $faker->firstName . ' ' . $faker->lastName,
        'nick_name'      => $faker->company,
        'street_address' => function () {
            return factory(App\StreetAddress::class)->create()->toArray();
        }
    ];
});