Некоторым конкретным классам 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