首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 5型工厂零误差

Laravel 5型工厂零误差
EN

Stack Overflow用户
提问于 2016-12-23 20:48:41
回答 1查看 2.6K关注 0票数 1

这是当我试图只为我的消息模型使用模型工厂时收到的错误。其他的模型工厂运行得很好,我在laravel的FactoryBuilder中跟踪到了FactoryBuilder方法,实际上它是空的,我只是不知道为什么。我已经定义了模型类,创建了表,在我的方法中为消息添加种子数据的代码正在工作,但是这个错误是在插入第一个记录之后抛出的,这样它就不会为我添加一堆种子数据。

代码语言:javascript
复制
[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}

//模型工厂

代码语言:javascript
复制
$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();
}
});

//使用模型工厂

代码语言:javascript
复制
<?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();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-23 22:24:29

您会得到错误,因为模型工厂定义需要返回一个数组,该数组包含正在创建的模型实例的属性。

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

模型工厂

代码语言:javascript
复制
$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

代码语言:javascript
复制
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,
                        ]);
                }
            });
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41307683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档