Я работаю с 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;
}
Кстати: я использую laravel-permissions
, библиотеку, созданную Spatie.
Что эта функция делает, так это получает каждые 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 не существует.
в> /home/ironman/Documentos/Sandbox/Proventas/Backend/vendor/laravel/framework/src/Illuminate/Support/Traits/Macroable.php:99
95 | * /
96 | публичная функция __call ($ метод, $ параметры)
97 | {
98 | if (! static :: hasMacro ($ method)) {
99 | бросить новый BadMethodCallException (sprintf (
100 | 'Метод% s ::% s не существует.', Статический :: класс, $ метод
101 | ));
102 | }
103 |
Трассировка исключений:
1 Подсветка \ Поддержка \ Коллекция :: __ call ("пользователи", [])
/home/ironman/Documentos/Sandbox/Proventas/Backend/database/factories/OrderFactory.php:10
2 Подсветка \ База данных \ Eloquent \ Factory :: {closure} (Объект (Создатель \ Генератор), [])
/home/ironman/Documentos/Sandbox/Proventas/Backend/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php:274
Пожалуйста, используйте аргумент -v, чтобы увидеть больше деталей.
Что я могу сделать, чтобы решить эту проблему? Я знаю, что использование Laravel Relationships решит мою проблему, но в спецификациях этого проекта сказано, что я должен держать вещи такими, какие есть.