Тест возвращает ноль для поля NOT NULL со значением по умолчанию - PullRequest
0 голосов
/ 12 мая 2018

У меня есть следующий код: я использую его простым способом для извлечения столбцов таблицы feature_set, поэтому хотел бы air_conditioning, pool ... и т. Д. С логическим значением, которое по умолчанию равно 0.

Однако, когда я использую фабрику или создаю ее непосредственно, как показано ниже -> air_conditioning всегда имеет значение null, и я не могу понять, почему. Я тестировал с mysql Db, и когда я добавляю новую строку, он по умолчанию принимает значение 0. Я что-то здесь упускаю, почему в экземпляре модели не установлены значения по умолчанию 0.

class FeatureSetTest extends TestCase
{
    use RefreshDatabase;
  public function testCanCreateFeatureSetAndValuesDefaultToFalse()
   {
       $featureSet = new FeatureSet(['property_id' => '1']);
       $featureSet->save();

       $this->assertFalse($featureSet->air_conditioning);
   }
}

...

    public function up()
   {
       Schema::create('feature_sets', function (Blueprint $table) {
           $table->increments('id');
           $table->unsignedInteger('property_id');
           $table->boolean('air_conditioning')->default(false);
           $table->timestamps();
       });
   }

Если я сохраню dd $ featureSet после его сохранения в тесте, я получу:

 #attributes: array:4 [
   "property_id" => "1"
   "updated_at" => "2018-05-12 16:15:19"
   "created_at" => "2018-05-12 16:15:19"
   "id" => 1
 ]

Если я сделаю dd (DB :: select (DB :: raw ('SHOW CREATE TABLE feature_sets')))); выводит нижнее значение, поэтому 0 устанавливается по умолчанию и:

 CREATE TABLE `feature_sets` (\n
           `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n
           `property_id` int(10) unsigned NOT NULL,\n
           `air_conditioning` tinyint(1) NOT NULL DEFAULT '0',\n
           `created_at` timestamp NULL DEFAULT NULL,\n
           `updated_at` timestamp NULL DEFAULT NULL,\n
           PRIMARY KEY (`id`)\n
         ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_c

И, наконец, если я поставлю dd (DB :: select (DB :: raw ('SELECT * FROM feature_sets'))); в моем тесте я вижу, что значение по умолчанию установлено правильно:

array:1 [
  0 => {#598
    +"id": 1
    +"property_id": 1
    +"air_conditioning": 0
    +"created_at": "2018-05-12 15:44:31"
    +"updated_at": "2018-05-12 15:44:31"
  }
]

// Модель набора функций.

<?php

namespace App\Models\Property;

use Illuminate\Database\Eloquent\Model;

class FeatureSet extends Model
{
    protected $guarded = [];

    public function asFeaturesArray()
    {

        return [
            'air_conditioning' => [
                'title' => __('Air Conditioning'),
                'value' => $this->air_conditioning
            ]
        ];
    }
}

Я не понимаю, почему он не возвращает мне 0 для -> air_conditioning

1 Ответ

0 голосов
/ 12 мая 2018

Оказывается, что $featureSet->refresh() является ответом на это, ->fresh() выше, чтобы просто получить свежие значения для существующих атрибутов, которые есть в модели, а в качестве обновления получить свежую версию всех атрибутов - включая мое значение по умолчанию 0Атрибуты.

fresh = Перезагрузить свежий экземпляр модели из базы данных.refresh = Перезагрузить текущий экземпляр модели со свежими атрибутами из базы данных.

Здесь найдено решение - https://github.com/laravel/framework/issues/21449

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