【问题标题】:Is laravel seeding as hard as I see it or I'm stumbling with something that's not that complicated?laravel 播种是否像我看到的那样难,还是我遇到了一些不那么复杂的事情?
【发布时间】:2020-10-24 11:02:01
【问题描述】:

最近几天,我一直在用播种机把头靠在墙上。我似乎无法掌握它。

关系很简单:

一个品牌有很多产品,每个产品都属于一个品牌。

一个类别有许多产品,每个产品都属于一个类别。

鉴于此,我在开始时创建了 5 个类别,以便以后可以随机检索一个。

我还创建了 10 个品牌,我为每个品牌创建了 50 种产品,并让它们属于那个品牌。然后我创建与产品和类别的关系,为每个产品检索一个随机类别。

我收到此错误:

PDOException::("SQLSTATE[HY000]: General error: 1364 Field 'brand_id' doesn't have a default value")

我不明白为什么会出现此错误,因为我是在创建产品之前创建关系:
$brand->products()->saveMany(factory(App\Product::class, 50).

public function run()
    {
        $users = factory(\App\User::class, 1000)->create();
        $categories = factory(\App\Category::class, 5)->create();

        factory(App\Brand::class, 10)->create()->each(function ($brand) {
            $brand->products()->saveMany(factory(App\Product::class, 50)->make()->each(function ($product) use ($brand) {
                $product->category()->associate($this->getRandomCategory());
                $product->save();
            }));
        });
    }
    
    private function getRandomCategory() {
        return \App\Category::all()->random();
    }

    private function getRandomUser() {
        return \App\User::all()->random();
    }

我不知道我是否通过播种做了很多事情,但这对我来说似乎很复杂。也许我在使用工厂时采取了错误的方法。有没有很好的播种教程? 提前致谢!

【问题讨论】:

    标签: laravel seed seeding laravel-seeding


    【解决方案1】:

    问题是这个:

    saveMany 方法在每个函数完成后被调用,所以我在添加品牌关系之前有点保存产品。这就是为什么它不能分配foreign_key brand_id。这是工作的代码块:

    public function run()
        {
            $users = factory(\App\User::class, 1000)->create();
            $categories = factory(\App\Category::class, 5)->create();
    
            factory(App\Brand::class, 10)->create()->each(function ($brand) {
                $brand->products()->saveMany(factory(App\Product::class, 50)->make()->each(function ($product) use ($brand) {
                    $product->category()->associate($this->getRandomCategory());
    
                }));
            });
        }
    
        private function getRandomCategory() {
            return \App\Category::all()->random();
        }
    
        private function getRandomUser() {
            return \App\User::all()->random();
        }
    

    【讨论】:

      【解决方案2】:

      这实际上不是播种问题。 PDO 驱动程序已经告诉您该问题:

      brand_id 没有默认值

      Laravel 可能假设 id 列不需要默认值,因此不会插入带有 id 的列。但是该列似乎在数据库中没有默认定义(应该是 smth.like AUTO_INCREMENT)。这就是您从数据库收到错误的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-21
        • 2011-06-09
        • 1970-01-01
        • 2019-06-21
        • 2010-09-27
        • 1970-01-01
        相关资源
        最近更新 更多