【问题标题】:Laravel seeder inserts only a random number of data and then failsLaravel 播种机只插入随机数量的数据然后失败
【发布时间】:2016-04-23 00:27:26
【问题描述】:

我有这个播种机功能。它获取所有插入的用户,然后为每个用户生成一个随机数(从 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 位的。

我打印了当前正在处理的配置文件图片的 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();

【问题讨论】:

  • 检查您的错误日志以获取完整的错误消息,其中应包括发生错误的确切文件和行。
  • 好的,我会检查的。无论如何,我刚刚编辑了我的问题。
  • 谢谢博格丹。请参阅我的帖子(作为答案)。

标签: php laravel laravel-seeding


【解决方案1】:

啊,我自己找到了解决方案。。问题出在我的ModelFactory.php我已经浏览了所有注册用户。我在我的种子文件中又做了一次。这就是它失败的原因。

// 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)
    ];
});

如果能够将参数传递给工厂but unfortunately we can't,那就太好了。这样我就可以为每个用户生成随机数量的个人资料图片。但是在这里,呃。

【讨论】:

  • 从您上次的编辑来看,还有另一件事需要考虑。你说当factory 只生成一个模型时它会失败。当生成多个模型时,factory 返回模型的Collection,因此当您使用foreach 对其进行迭代时,它会按预期工作。但是当factory 只生成一个模型时,它会返回一个App\User 实例而不是集合,所以当你尝试使用foreach 进行迭代时,实际上是在迭代模型的属性,这不是你想要的,而$pp->id 很可能是错误的罪魁祸首,因为它无效。
  • 要解决这个问题,您可以在需要时在 foreach 之前创建一个集合,方法是添加以下条件:if ($profile_pics instanceof App\User) { $profile_pics = collect([$profile_pics]); }。如果factory 返回一个用户实例,它将用它创建一个集合,以便可以使用foreach 语句正确迭代。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 2014-12-30
  • 2022-12-17
  • 2017-12-06
  • 1970-01-01
相关资源
最近更新 更多