mysql - 在 Laravel 中如何通过 Model 知道表列是否为外键?
问题描述
所以正如标题所说,我怎么知道 Model 的字段是否是 Laravel 中的外键?
假设我有一个名为 show_type_id 的 FK 列和一个名为 Event 的模型,我想知道是否有一个函数给出了模型类或模型表,如果是,则命名字段返回 true,否则返回 false。
...
$model = Event:class; // or Event::getTable();
$isFK = isFK('show_type_id', $model);
...
编辑
感谢@piscator,这是有效的:
use Illuminate\Support\Facades\Schema;
function isFK(string $table, string $column): bool
{
$fkColumns = Schema::getConnection()
->getDoctrineSchemaManager()
->listTableForeignKeys($table);
$fkColumns = collect($fkColumns);
return $fkColumns->map->getColumns()->flatten()->search($column) !== FALSE;
}
解决方案
试试这个,假设你的表名是“事件”:
Schema::getConnection()
->getDoctrineSchemaManager()
->listTableForeignKeys('events')
这将返回Doctrine\DBAL\Schema\ForeignKeyConstraint
对象。
使用这些数据,您可以编写如下isFK
方法:
use Illuminate\Support\Facades\Schema;
function isFK(string $table, string $column): bool
{
$fkColumns = Schema::getConnection()
->getDoctrineSchemaManager()
->listTableForeignKeys($table);
return collect($fkColumns)->map(function ($fkColumn) {
return $fkColumn->getColumns();
})->flatten()->contains($column);
}
推荐阅读
- java - 内存不足时的 Java EE 堆转储
- ansible - 创建使用 root 的幂等 playbook 然后禁用 root 服务器访问
- c# - Twitter API 授权问题 - 401 错误
- ruby-on-rails - 在旧版 Rails 应用程序中安装 webpacker
- flutter - Flutter 使用 Base64 或其他 MP3 编码器/解码器
- java - 如何在像whatsapp或skype这样的recyclerview中实现淡出stickyheader?
- java - 如何将数据加载到recyclerView
- c - 使用 GMenu 的菜单中的巨大差距
- angular - 如何使用 Firebase 在数组中推送新项目
- android - Flutter Firebase 错误 Null 资金(FirebaseUser)无法分配给参数,仪表类型 FutureOr