Laravel:调用另一个工厂内的工厂

时间:2021-04-14 15:45:42

标签: laravel-8

我想使用 laravel 8 工厂为我的数据库做种。我有一家商店,每个商店都可以有多个活动。

所以在我的商店模型中我定义了关系:

public function campaigns() {
   return $this->hasMany('App\Models\ShopCampaign','id_shop', 'ID');
}

在活动模型中也定义了逆关系

public function shop() {
    return $this->belongsTo('App\Models\Shop','id_shop', 'ID');
}

然后我定义了活动工厂:

namespace Database\Factories;

use App\Models\ShopCampaign;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Carbon;

class ShopCampaignFactory extends Factory
{
    protected $model = ShopCampaign::class;

    public function definition()
    {
        $date_ins = Carbon::createFromTimestamp($this->faker->dateTimeBetween('-1 week', '-2 days')->getTimeStamp());
        $starts_at = Carbon::createFromFormat('Y-m-d H:i:s', $date_ins)->addDays( $this->faker->numberBetween( 2, 5 ) );
        $ends_at= Carbon::createFromFormat('Y-m-d H:i:s', $starts_at)->addDays( $this->faker->numberBetween( 20, 30 ) );
        
        $attributes = [
            'datestart' => $starts_at,
            'dateend' => $ends_at,
            'name' => 'Test',
            'dateins' => $date_ins
        ];

        return $attributes;
    }

}

现在我想要实现的结果是创建 5 个商店,每个商店都必须有 3 个活动广告系列。这意味着在创建广告系列时必须填充 id_shop。但是我认为 id 应该神奇地被定义的关系所采用。但是如果我创建一个种子类并调用:

Shop::factory(5)->has(ShopCampaign::factory()->count(3), 'campaigns')->create();

我得到了:

 Call to undefined method App\Models\ShopCampaign::factory()

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我刚刚发现了答案,手册上没有写清楚。在 ShopCampaign 手册中,您必须添加:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class ShopCampaign extends Model
{
    use HasFactory;

    [...]
}
相关问题