Laravel 5.6 - Использование функций модели в ModelFactory - PullRequest
0 голосов
/ 31 августа 2018

Я работаю с 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 решит мою проблему, но в спецификациях этого проекта сказано, что я должен держать вещи такими, какие есть.

1 Ответ

0 голосов
/ 01 сентября 2018

Ваш звонок на

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

не возвращает ни одной компании. Он возвращает коллекцию, которая не имеет динамической функции users . Попробуйте

$company = Company::get()->random(1)->first();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...