2015-01-02 3 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`'); 
관련 문제