簡體   English   中英

如何使用 eloquent 在 laravel 遷移中刪除 POSTGRES 表或視圖?

[英]How do I drop a POSTGRES Table or a View in a laravel migration using eloquent?

我知道有一個與 postgres 類似的問題,但它使用原始 Sql,我正在尋找一個 laravel 遷移友好的 ORM 解決方案。 這就是為什么這個問題是不同的。 從長遠來看,這可能是正確的答案,但我想我會把它提交給社區。

有時我的數據集是表格,有時是視圖。 如果我們正在運行單元測試構建,它作為一個表存在,但在其他任何地方它都是一個視圖。

這就是我得到的。 顯然這不是主意。 這不是一個准確的條件。 雖然它可以在我想要的時候執行,但它不是真正檢查視圖是否存在。 我想要一種方法來檢查 postgres 模式以查看視圖是否存在。

if ('dev' === env('APP_ENV') || 'production' === env('APP_ENV')) {
    $sql = 'DROP VIEW IF EXISTS backend.friends';
    DB::statement($sql);   
} else {
    Schema::dropIfExists('backend.friends');
}

大多數情況下,我需要一個條件。 像這樣的東西。 任何想法好的堆棧朋友?

if (backed.friends) == view { 
    $sql = 'DROP VIEW IF EXISTS backend.partners'; 
} else {
    Schema::dropIfExists('backend.friends');
}

謝謝!

答案是 Tim Lewis 建議的, staudenmeir/laravel-migration-views package。 我們使用它的方式如下:

由於我們已經有了 laravel 使用的命名空間 class Schema,我們需要給它起別名。

use Staudenmeir\LaravelMigrationViews\Facades\Schema as ViewSchema; 然后您可以執行條件和操作,例如:

if (!empty($view) && ViewSchema::connection('<schema>')->hasView($view)) {
    ViewSchema::dropViewIfExists('<schema>.' . $view);
}

(當然替換<schema>以適用於您的情況)

在我們的例子中,我們正在從一個模式遷移到另一個模式,我們需要能夠查看視圖是否存在,否則根據情況創建或刪除它們。

基本上你以前可以在表格上做的所有事情,現在都可以應用於視圖。

ViewSchema::connection('old_schema')->hasView('example')
ViewSchema::dropViewIfExists('old_schema.'.$exampleView);

這是 repo,感謝 staudenmeir 讓這個存在! https://github.com/staudenmeir/laravel-migration-views

我敢肯定還有更多功能,但這就是我們迄今為止所需要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM