代码之家  ›  专栏  ›  技术社区  ›  enbermudas

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

  •  0
  • enbermudas  · 技术社区  · 7 年前

    Laravel 5.6 在扩展项目功能时发现自己遇到了一个奇怪的问题。

    现在我需要创建两个新模型: order item Faker 以及拉维工厂/播种机。最大的问题是在与 秩序 模型。

    company 外键名为 company_id user seller_id . 公司没问题,麻烦就在我身后 卖家id

    role 与公司相关我的工厂会随机挑选它,因为用户与公司(直接)没有关系,我不能只是用一个 公司id

    为了让所有用户都与我的公司“相关”,我在我的网站上创建了下一个函数 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 ,一个由Spatiale制作的图书馆。

    角色 公司 然后将其推送到一组用户。

    此自定义帮助程序: 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:方法\Database\Eloquent\Collection::users不存在。

    在>/home/ironman/Documentos/Sandbox/Proventas/Backend/vendor/laravel/framework/src/Illuminate/Support/Traits/Macroable.php:99 96 |公共函数uu调用($method,$parameters) 97| { 100 |'方法%s::%s不存在',静态::类,$Method 101| )); 102| } 103|

    1\Support\Collection::\u call(“用户”,[])

    2\Database\Eloquent\Factory::{closure}(对象(Faker\Generator),[]) /home/ironman/Documentos/Sandbox/Proventas/Backend/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php:274

    请使用参数-v查看更多详细信息。

    我能做些什么来解决这个问题吗?我知道使用Laravel关系可以解决我的问题,但这个项目的规范说,我必须保持事情的原样。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Jason    7 年前

    你的电话

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

    不返回单个公司。它返回一个集合,该集合没有

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