Непоследовательное поведение с использованием Laravel ModelFactory. В некоторых моделях Model :: find ($ id) завершается ошибкой, если только $ id не приведен к строке - PullRequest
0 голосов
/ 03 апреля 2019

Некоторым конкретным классам Model в моем приложении не удается получить созданные в ModelFactory модели на основе целого числа id. Другие модели, созданные в том же тесте phpunit, без проблем извлекаются с идентификатором как string или int. Это приводит к сбою нисходящего кода с использованием Model::find($int), но Model::where('id',$int)->first() и Model::find((string)$int) для правильной работы. Смотрите код и приведите примеры. Использование sqlite и: memory: для тестирования PHPUnit.

Их извлечение прекрасно работает в производственных данных mysql.

Нет переопределяющих методов __contructor () ни в одной из моделей.

Все миграции таблиц имеют одинаковый init с соответствующим, предварительно объявленным $ primaryKey в их Модельном классе: $table->increments('video_mode_id');

//Example factories
$factory->define(Video_Mode::class, function (Faker\Generator $faker) {
    return [
    'video_mode_id' => 3,
    'label'   => '1920x1080 TrueColor',
    ];
});

$factory->define(User::class, function (Faker\Generator $faker) {
    static $password;
    $email = $faker->unique()->safeEmail;
    return [
        'user_id'   => 4,
        'last_name' => $faker->name,
        'email' => $email,
        'username' => $email,
        'password' => $password ?: $password = bcrypt('secret'),
        'pw' => $password ?: $password = md5('secret'),
        'remember_token' => str_random(10),
    ];
});

$factory->define(Sign::class, function (Faker\Generator $faker) {
    $sign_id = $faker->numberBetween(1000,5000);
    return [
    'sign_id' => $sign_id,
    'user_id'   => 4,
    'campaign_id' => 8443,
    'video_mode_id' => 3,
    'router_id' => 6,
    ];
});

$factory->define(Campaign::class, function (Faker\Generator $faker) {

    return [
    'campaign_id' => 8443,
    'owner_id'   => 4,
    ];
});

$factory->define(Router::class, function (Faker\Generator $faker) {
    return [
    'router_id' => 6,
    'connection_type'   => 'wireless',
    ];
});

//TESTS:

//All pass
var_dump(Video_Mode::where('video_mode_id',3)->first()->getAttribute('video_mode_id'));
var_dump(Video_Mode::find((string)3)->getAttribute('video_mode_id'));
var_dump(Video_Mode::find(3)->getAttribute('video_mode_id'));

//All pass
var_dump(User::where('user_id',4)->first()->getAttribute('user_id'));
var_dump(User::find((string)4)->getAttribute('user_id'));
var_dump(User::find(4)->getAttribute('user_id'));

//All pass
var_dump(Sign::where('sign_id',$this->sign_id)->first()->getAttribute('sign_id'));
var_dump(Sign::find((string)$this->sign_id)->getAttribute('sign_id'));
var_dump(Sign::find($this->sign_id)->getAttribute('sign_id'));

//3rd fails
var_dump(Campaign::where('campaign_id',8443)->first()->getAttribute('campaign_id'));
var_dump(Campaign::find((string)8443)->getAttribute('campaign_id'));
var_dump(Campaign::find(8443)->getAttribute('campaign_id'));

//3rd fails
var_dump(Router::where('router_id',$this->getRouterId())->first()->getAttribute('router_id'));
var_dump(Router::find((string)$this->getRouterId())->getAttribute('router_id'));
var_dump(Router::find($this->getRouterId())->getAttribute('router_id'));

Все тесты в моделях "Video_Mode" "User" и "Sign" возвращают правильное целое число идентификатора ключа, независимо от того, как я пытаюсь их получить.

Только первые два теста последующих моделей "Маршрутизатор" и "Кампания" возвращаются с действительной моделью. Третий бросок Call to a member function getAttribute() on null

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...