Laravel 5.6 - 在 ModelFactory 中使用模型函数
Laravel 5.6 - Using model functions in ModelFactory
我正在使用 Laravel 5.6
并在扩展我的项目功能时发现自己遇到了一个奇怪的问题。
现在我需要创建两个新模型:order
和 item
。使用 Faker
和 Laravel Factories/Seeders 用虚拟数据填充项目 table 非常容易。最大的问题是在使用 order
模型时。
这个小家伙与外键 company_id
的 company
和外键 seller_id
的 user
有关。公司领域还好,麻烦在我的背后seller_id
这位卖家需要一个 role
与公司相关的公司,我的工厂会随机挑选它,因为用户与公司没有(直接)相关,我不能只用 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 : Method Illuminate\Database\Eloquent\Collection::users does not exist.
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| throw new BadMethodCallException(sprintf(
100| 'Method %s::%s does not exist.', static::class, $method
101| ));
102| }
103|
Exception trace:
1 Illuminate\Support\Collection::__call("users", [])
/home/ironman/Documentos/Sandbox/Proventas/Backend/database/factories/OrderFactory.php:10
2 Illuminate\Database\Eloquent\Factory::{closure}(Object(Faker\Generator), [])
/home/ironman/Documentos/Sandbox/Proventas/Backend/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php:274
Please use the argument -v to see more details.
我能做些什么来解决这个问题吗?我知道使用 Laravel 关系可以解决我的问题,但该项目的规格说明我必须保持原样。
您的来电
$company = Company::get()->random(1);
不 return 一家公司。它 return 是一个集合,没有 users 动态函数。尝试
$company = Company::get()->random(1)->first();
我正在使用 Laravel 5.6
并在扩展我的项目功能时发现自己遇到了一个奇怪的问题。
现在我需要创建两个新模型:order
和 item
。使用 Faker
和 Laravel Factories/Seeders 用虚拟数据填充项目 table 非常容易。最大的问题是在使用 order
模型时。
这个小家伙与外键 company_id
的 company
和外键 seller_id
的 user
有关。公司领域还好,麻烦在我的背后seller_id
这位卖家需要一个 role
与公司相关的公司,我的工厂会随机挑选它,因为用户与公司没有(直接)相关,我不能只用 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 : Method Illuminate\Database\Eloquent\Collection::users does not exist.
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| throw new BadMethodCallException(sprintf( 100| 'Method %s::%s does not exist.', static::class, $method 101| )); 102| } 103|
Exception trace:
1 Illuminate\Support\Collection::__call("users", []) /home/ironman/Documentos/Sandbox/Proventas/Backend/database/factories/OrderFactory.php:10
2 Illuminate\Database\Eloquent\Factory::{closure}(Object(Faker\Generator), []) /home/ironman/Documentos/Sandbox/Proventas/Backend/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php:274
Please use the argument -v to see more details.
我能做些什么来解决这个问题吗?我知道使用 Laravel 关系可以解决我的问题,但该项目的规格说明我必须保持原样。
您的来电
$company = Company::get()->random(1);
不 return 一家公司。它 return 是一个集合,没有 users 动态函数。尝试
$company = Company::get()->random(1)->first();