我正在与Laravel 5.6
合作,在扩展我的项目功能时发现自己是一个奇怪的问题。
现在我需要创建两个新模型:order
和item
。使用Faker
和Laravel Factories / Seeders用虚拟数据填充项目表非常容易。最大的问题是在使用order
模型时。
这个小家伙与一个名为company
和company_id
的外键user
有一个名为seller_id
的外键。公司领域还可以,麻烦在我的seller_id
背后
这个卖家需要一个与公司相关的role
,我的工厂会随机选择它,因为用户与公司没有关联(直接),我不能只用company_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;
}
顺便说一句:我正在使用由Spatie制作的图书馆laravel-permissions
。
这个函数的作用是从role
获取每个company
然后将它推送到一组用户。
这个自定义帮助器: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 :: {closure}(对象(Faker \ Generator),[])/ home / ironman / Documentos / Sandbox / Proventas / Backend / vendor / laravel / framework / src / Illuminate / Database / Eloquent /FactoryBuilder.php:274
请使用参数-v查看更多详细信息。
有什么办法可以解决这个问题吗?我知道使用Laravel Relationships会解决我的问题,但是这个项目的规格说我必须保持原样。
你的来电
$company = Company::get()->random(1);
没有退回一家公司。它返回一个Collection,它没有用户动态函数。尝试
$company = Company::get()->random(1)->first();