Laravel 数据填充器只能插入随机数量的数据,然后失败。

5

我有一个Seeder函数。它会获取所有已插入的用户,然后为每个用户生成0到12之间的随机数量的个人资料图片。

public function run()
{
    foreach (App\User::all() as $user) {

        echo "Generating profile pic for $user->name ($user->id)... ";
        $profile_pics = factory(App\Image::class, rand(0, 12))->create();

        echo count($profile_pics) . " generated. ";
        echo " Saving... ";

        foreach ($profile_pics as $pp) {
            $user->profile_pics()->save(App\Image::find($pp->id));
        }

        echo "Saved\n";

    }
}

当我运行它时,一些随机用户的个人资料图片被正确插入。但之后就失败了。
Generating profile pic for Amara Abbott I (1)... 5 generated.  Saving... Saved
Generating profile pic for Major Crist (2)... 12 generated.  Saving... Saved
Generating profile pic for Imelda Hettinger IV (3)... 3 generated.  Saving... Saved
Generating profile pic for Tyrique Von (4)... 5 generated.  Saving... Saved
Generating profile pic for Keshawn Mills IV (5)... 1 generated.  Saving...

  [ErrorException]
  Trying to get property of non-object

在我的数据库中,最后插入的头像是给第65个用户而不是第5个用户。

enter image description here

我打印了当前处理的头像id,显然当头像数量为1时会失败。

Generating profile pic for Gerald Kohler (10)... 3 generated.  Saving... 56 57 58 Saved
Generating profile pic for Dr. Reagan Donnelly IV (11)... 10 generated.  Saving... 59 60 61 62 63 64 65 66 67 68 Saved
Generating profile pic for Edwardo Leffler (12)... 2 generated.  Saving... 69 70 Saved
Generating profile pic for Jaylen Harris (13)... 11 generated.  Saving... 71 72 73 74 75 76 77 78 79 80 81 Saved
Generating profile pic for Clark Franecki (14)... 5 generated.  Saving... 82 83 84 85 86 Saved
Generating profile pic for Leatha Schiller I (15)... 6 generated.  Saving... 87 88 89 90 91 92 Saved
Generating profile pic for Natasha Stiedemann (16)... 2 generated.  Saving... 93 94 Saved
Generating profile pic for Royce Kshlerin (17)... 11 generated.  Saving... 95 96 97 98 99 100 101 102 103 104 105 Saved
Generating profile pic for Dedric Lang (18)... 8 generated.  Saving... 106 107 108 109 110 111 112 113 Saved
Generating profile pic for Jayden Haag (19)... 2 generated.  Saving... 114 115 Saved
Generating profile pic for Maeve Haley (20)... 4 generated.  Saving... 116 117 118 119 Saved
Generating profile pic for Ana Zboncak (21)... 12 generated.  Saving... 120 121 122 123 124 125 126 127 128 129 130 131 Saved
Generating profile pic for Winnifred Ruecker (22)... 7 generated.  Saving... 132 133 134 135 136 137 138 Saved
Generating profile pic for Guy Fisher Jr. (23)... 9 generated.  Saving... 139 140 141 142 143 144 145 146 147 Saved
Generating profile pic for Adelle Upton (24)... 9 generated.  Saving... 148 149 150 151 152 153 154 155 156 Saved
Generating profile pic for Armando Schamberger MD (25)... 1 generated.  Saving...

  [ErrorException]
  Trying to get property of non-object

怎么回事?

当只创建一个元素时,这会产生什么结果?

factory(App\Image::class, rand(0, 12))->create();

请检查您的错误日志以获取完整的错误信息,其中应包括发生错误的确切文件和行。 - Bogdan
好的,我会去看看。不管怎样,我刚刚编辑了我的问题。 - David
谢谢Bogdan。请查看我的帖子(作为答案)。 - David
1个回答

2
啊,我刚刚自己找到了解决方案。问题出在我的ModelFactory.php文件中,我已经查看了所有注册用户。但是我在我的Seed文件中又重复执行了一遍。这就是为什么它失败的原因。
// ModelFactory.php
$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        'user_id' => App\User::all()->random()->id,
        'base_url' => $faker->imageUrl(350, 350)
    ];
});

如果能够向工厂传递参数就太好了,但不幸的是我们不能这样做。这样我就可以为每个用户生成随机数量的个人资料图片。但是,在这里,嗯。


1
还有一件事需要考虑,根据您最后的编辑,您说当factory只生成一个模型时会失败。当factory生成多个模型时,它将返回一个模型集合,因此使用foreach迭代时会按预期工作。但是当factory仅生成一个模型时,它将返回一个App\User实例而不是集合,因此当您尝试使用foreach进行迭代时,实际上是在迭代模型的属性,这不是您想要的,$pp->id很可能是错误的罪魁祸首,因为它无效。 - Bogdan
1
为了解决这个问题,您可以在需要时在foreach之前创建一个集合,通过添加此条件来实现:if ($profile_pics instanceof App\User) { $profile_pics = collect([$profile_pics]); }。如果“factory”返回用户实例,则会使用它创建一个集合,以便可以正确地使用“foreach”语句进行迭代。 - Bogdan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接