首页 文章

Laravel 5.6 - 在ModelFactory中使用模型函数

提问于
浏览
0

我正在使用 Laravel 5.6 ,在扩展我的项目功能时发现自己是一个奇怪的问题 .

现在我需要创建两个新模型: orderitem . 使用 Faker 和Laravel Factories / Seeders用虚拟数据填充项目表非常容易 . 最大的问题是使用 order 模型时 .

这个小家伙与一个名为 company_id 的外键和一个名为 seller_id 的外键的 user 相关 . 公司领域还可以,麻烦在我身后 seller_id

这个卖家需要_11107660_与我公司随机选择的公司有关,因为用户与公司没有关联(直接),我不能只用 company_id 寻找它 .

为了让所有用户"related"到我的公司,我在我的 Company 模型上创建了下一个功能:

public function users()
{
    $roles = $this->roles;
    $users = [];
    foreach ($roles as $role) {
        foreach ($role->users as $user) {
            $user->makeHidden(['pivot']);
            array_push($users, $user);
        }
    }

    $users = array_unique_objects($users);
    return $users;
}

顺便说一句:我正在使用 laravel-permissions ,一个由Spatie制作的图书馆 .

这个函数的作用是从 company 获取每个 role 然后将它推送到用户数组 .

这个自定义帮助器: array_unique_objects 跟踪我的阵列上的任何重复用户并删除它们 .

该功能可以找到,因为我已经在几个控制器上进行了测试,所以我知道它没有任何问题 . 无论哪种方式,我的 OrderFactory.php 看起来像这样:

<?php

use Faker\Generator as Faker;

use App\Models\User;
use App\Models\Company;

$factory->define(App\Models\Order::class, function (Faker $faker) {
    $company = Company::get()->random(1);
    $users = $company->users();
    $user = array_random($users);
    return [
        'company_id' => $company,
        'seller_id' => $user->id,
        'code' => strtoupper(str_random(10)),
        'description' => $faker->sentence($nbWords = rand(2, 4), $variableNbWords = true),
        'created_at' => $faker->dateTimeBetween($startDate = '-1 year', $endDate = 'now', $timezone = null)
    ];
});

但是当我运行 php artisan db:seed 命令时,它会在控制台中抛出下一个错误:

BadMethodCallException:方法Illuminate \ Database \ Eloquent \ Collection :: users不存在 . at> /home/ironman/Documentos/Sandbox/Proventas/Backend/vendor/laravel/framework/src/Illuminate/Support/Traits/Macroable.php:99 95 | * / 96 | public function __call($ method,$ parameters)97 | {98 | if(!static :: hasMacro($ method)){99 |抛出新的BadMethodCallException(sprintf(100 |'方法%s:%s不存在 . ',static :: class,$ method 101 |)); 102 | } 103 |异常跟踪:1 Illuminate \ Support \ Collection :: __ call(“users”,[])/home/ironman/Documentos/Sandbox/Proventas/Backend/database/factories/OrderFactory.php:10 2 Illuminate \ Database \ Eloquent \ Factory :: (对象(Faker \ Generator),[])/ home /ironman / Docuocuos / Sandbox / Proventas / Backend / vendor / raravel / frame / src / Illogate / Database / Eloquent / FactoryBuilder.php:274请使用参数-v可以查看更多细节 .

有什么办法可以解决这个问题吗?我知道使用Laravel Relationships可以解决我的问题,但是这个项目的规格说我必须保持原样 .

1 回答

  • 1

    你的来电

    $company = Company::get()->random(1);
    

    没有退回一家公司 . 它返回一个Collection,它没有用户动态函数 . 尝试

    $company = Company::get()->random(1)->first();
    

相关问题