如何使用 eloquent 在 laravel 迁移中删除 POSTGRES 表或视图?

Posted

技术标签:

【中文标题】如何使用 eloquent 在 laravel 迁移中删除 POSTGRES 表或视图?【英文标题】:How do I drop a POSTGRES Table or a View in a laravel migration using eloquent? 【发布时间】:2021-03-31 08:56:18 【问题描述】:

我知道有一个与 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');

谢谢!

【问题讨论】:

这个插件可能对你有用:github.com/staudenmeir/laravel-migration-views。它允许您简单地调用Schema::dropIfExists('backend.friends');Schema::dropViewIfExists('backend.friends');,因此您根本不需要条件。 ifExists 部分将为您简单地处理它:) 刚开始回答这个问题!我想至少有一个其他组织/人需要一种简单的方法来谷歌搜索这个答案。再次感谢蒂姆! 【参考方案1】:

答案是 Tim Lewis 建议的 staudenmeir/laravel-migration-views 包。 我们使用它的方式如下:

由于我们已经有了 laravel 使用的命名空间类 Schema,我们需要给它起别名。

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

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

(当然替换 &lt;schema&gt; 以适用于您的情况)

在我们的例子中,我们正在从一个架构迁移到另一个架构,我们需要能够查看视图是否存在,否则根据情况创建或删除它们。

基本上你以前可以在表格上做的所有事情,现在都可以应用于视图。

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

这里是 repo,感谢 staudenmeir 让这个存在! https://github.com/staudenmeir/laravel-migration-views

我确信还有更多功能,但这就是我们目前所需要的。

【讨论】:

以上是关于如何使用 eloquent 在 laravel 迁移中删除 POSTGRES 表或视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Eloquent 在 Laravel 中开始查询?

如何在 laravel 5 中使用 Eloquent 更新数据透视表

如何在 Laravel/Eloquent 中获得完整的关系

Laravel Eloquent - orWhereHas 方法 - 何时使用以及如何使用

如何在 Eloquent 模型中使用 Laravel Livewire?

Laravel 5:如何使用 'where' 或 'orderBy' 使用 eloquent?