如何使用 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);
(当然替换 <schema>
以适用于您的情况)
在我们的例子中,我们正在从一个架构迁移到另一个架构,我们需要能够查看视图是否存在,否则根据情况创建或删除它们。
基本上你以前可以在表格上做的所有事情,现在都可以应用于视图。
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 - orWhereHas 方法 - 何时使用以及如何使用