【问题标题】:Laravel 5 Model Factories Null ErrorLaravel 5 模型工厂空错误
【发布时间】:2016-12-27 16:44:27
【问题描述】:

这是我尝试将模型工厂仅用于我的消息模型时收到的错误。其他模型工厂工作得很好,我已经追踪到 laravel 的 FactoryBuilder 中的 applyStates 方法,它实际上是空的,我只是不知道为什么。我定义了模型类,创建了表,我的方法中为消息添加种子数据的代码正在运行,但是在插入第一条记录后会引发此错误,使其无法为我添加一堆种子数据。

[2016-12-23 20:24:04] local.ERROR: Symfony\Component\Debug\Exception\FatalThrowableError: Type error: Argument 1 passed to Illuminate\Database\Eloquent\FactoryBuilder::applyStates() must be of the type array, null given, called in /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php on line 168 in /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php:180
Stack trace:

- 0 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php(168): Illuminate\Database\Eloquent\FactoryBuilder->applyStates(NULL, Array)
- 1  /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2282): Illuminate\Database\Eloquent\FactoryBuilder->Illuminate\Database\Eloquent\{closure}()
- 2 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php(170): Illuminate\Database\Eloquent\Model::unguarded(Object(Closure))
- 3 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php(143): Illuminate\Database\Eloquent\FactoryBuilder->makeInstance(Array)
- 4 [internal function]: Illuminate\Database\Eloquent\FactoryBuilder->Illuminate\Database\Eloquent\{closure}(1)
- 5 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php(144): array_map(Object(Closure), Array)
- 6 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php(113): Illuminate\Database\Eloquent\FactoryBuilder->make(Array)
- 7 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/database/seeds/MessagesTableSeeder.php(15): Illuminate\Database\Eloquent\FactoryBuilder->create()
- 8 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php(63): MessagesTableSeeder->run()
- 9 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2288): Illuminate\Database\Console\Seeds\SeedCommand->Illuminate\Database\Console\Seeds\{closure}()
- 10 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php(64): Illuminate\Database\Eloquent\Model::unguarded(Object(Closure))
- 11 [internal function]: Illuminate\Database\Console\Seeds\SeedCommand->fire()
- 12 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/laravel/framework/src/Illuminate/Container/Container.php(508): call_user_func_array(Array, Array)
- 13 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/laravel/framework/src/Illuminate/Console/Command.php(169): Illuminate\Container\Container->call(Array)
- 14 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/symfony/console/Command/Command.php(254): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
- 15 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/laravel/framework/src/Illuminate/Console/Command.php(155): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
- 16 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/symfony/console/Application.php(821): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
- 17 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/symfony/console/Application.php(187): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Database\Console\Seeds\SeedCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
- 18 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/symfony/console/Application.php(118): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
- 19 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(121): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
- 20 /Users/jcrawford/Dropbox/Work/RYNO/htdocs/artisan(35): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
- 21 {main}

// 模型工厂

$factory->define(Message::class, function(Faker\Generator $faker) {
$userIds = User::all()->pluck('id')->toArray();
$postIds = Post::all()->pluck('id')->toArray();

$post = Post::find($faker->randomElement($postIds));

$user1 = User::find($faker->randomElement($userIds));
$user2 = User::find($faker->randomElement($userIds));

$message1 = new Message([
    'post_id' => $post->id,
    'to_user_id' => $user1->id,
    'from_user_id' => $user2->id,
    'message' => $faker->sentence()
]);
$message1->save();

if(mt_rand(0,1) === 1) {
    // add message reply
    $message2 = new Message([
        'message_id' => $message1->id,
        'post_id' => $post->id,
        'to_user_id' => $user2->id,
        'from_user_id' => $user1->id,
        'message' => $faker->sentence()
    ]);

    $message2->save();
}
});

// 使用模型工厂

<?php

use Illuminate\Database\Seeder;
use App\Models\Message;

class MessagesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(Message::class, 200)->create();
    }
}

【问题讨论】:

  • 请使用php 7.2或更高版本

标签: laravel-5 eloquent


【解决方案1】:

您收到错误是因为 Model Factory definition 需要返回一个数组,其中包含您正在创建的模型实例的属性。

使用您当前的代码,您总是会得到至少 1 个或最终 2 个新的 Message(如果 mt_rand(0,1) 等于 true)。但是您的factory() 调用在第一次执行后总是会失败。试试这个:

模型工厂:

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

    $userIds = App\User::all()->pluck('id')->toArray();
    $postIds = App\Post::all()->pluck('id')->toArray();
    $post = App\Post::find($faker->randomElement($postIds));
    $user1 = App\User::find($faker->randomElement($userIds));
    $user2 = App\User::find($faker->randomElement($userIds));

    return [
        'message_id' => null, // default NULL
        'post_id' => $post->id,
        'to_user_id' => $user1->id,
        'from_user_id' => $user2->id,
        'message' => $faker->sentence()
    ];
});

MessagesTableSeeder:

class MessagesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(App\Message::class, 200)
            ->create()
            ->each(function ($m) {
                if(mt_rand(0,1) === 1) {
                    factory(App\Message::class)
                        ->create([
                            'message_id' => $m->id, // Overrides NULL attribute
                            'post_id' => $m->post_id, // Ensures same post
                            'to_user_id' => $m->from_user_id, // Switch from & to from relation
                            'from_user_id' => $m->to_user_id,
                        ]);
                }
            });
    }
}

【讨论】:

  • 感谢您的澄清!
猜你喜欢
  • 2016-10-17
  • 2017-04-23
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 2017-04-11
  • 2023-02-04
  • 2017-08-02
  • 1970-01-01
相关资源
最近更新 更多