2015-01-02 2 views
3

Я создаю таблицу, как это,Как добавить виртуальный столбец с построителем схемы?

Schema::create('booking_segments', function (Blueprint $table) { 
    $table->increments('id'); 

    $table->datetime('start')->index(); 
    $table->integer('duration')->unsigned(); 
    $table->string('comments'); 
    $table->integer('booking_id')->unsigned(); 
    $table->foreign('booking_id')->references('id')->on('bookings')->onDelete('cascade'); 
}); 

Но я хочу добавить еще один дополнительный столбец. Похоже, что это в сыром SQL:

ALTER TABLE booking_segments ADD COLUMN `end` DATETIME AS (DATE_ADD(`start`, INTERVAL duration MINUTE)) PERSISTENT AFTER `start` 

Как добавить его в мою миграцию? Мне также нужно будет создать на нем индекс.

ответ

5

Я знаю, это это старый вопрос, но есть способ сделать это, используя построитель схем с Laravel 5.3, поэтому я подумал, что я бы поставил его здесь для полноты.

Вы можете использовать laravel 5.3 column modifiers virtualAs или storedAs.

Таким образом, чтобы создать виртуальный генерируемый столбец должен быть вычислен на каждом запросе вы можете создать столбец так:

$table->dateTime('created_at')->virtualAs('DATE_ADD(`start`, INTERVAL duration MINUTE)'); 

Чтобы создать хранимую генерируемый столбец вы можете создать столбец, как это вместо:

$table->dateTime('created_at')->storedAs('DATE_ADD(`start`, INTERVAL duration MINUTE)'); 
1

Я не думаю, что вы можете сделать это с схемой застройщиком (кто-то пожалуйста, поправьте меня, если я ошибаюсь), но вы всегда можете «упасть обратно» сырой SQL:

DB::statement('ALTER TABLE booking_segments ADD COLUMN `end` DATETIME AS (DATE_ADD(`start`, INTERVAL duration MINUTE)) PERSISTENT AFTER `start`'); 
Смежные вопросы