在 Laravel 中如何通过 Model 知道表列是不是为外键?

Posted

技术标签:

【中文标题】在 Laravel 中如何通过 Model 知道表列是不是为外键?【英文标题】:How can I know if a table column is a foreign key in Laravel through Model?在 Laravel 中如何通过 Model 知道表列是否为外键? 【发布时间】:2021-01-17 01:55:48 【问题描述】:

所以正如标题所说,在 Laravel 中如何知道 Model 的字段是否是外键?

假设我有一个名为 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;


【问题讨论】:

【参考方案1】:

试试这个,假设你的表名是“events”:

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);

【讨论】:

感谢您的回答!我要试试这个 这几乎是我要找的,但数组索引 0 上的 getColumns() 只是返回一个外键...这是我更改的内容:$fkColumns = Schema::getConnection() ->getDoctrineSchemaManager() ->listTableForeignKeys('events'); return collect($fkColumns)->map->getColumns()->flatten()->search($column);谢谢! 谢谢,这样好多了。我已经确定了答案。

以上是关于在 Laravel 中如何通过 Model 知道表列是不是为外键?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过laravel创建数据透视表

如何在 laravel 4.2 中动态更改模型表?

如何在 Laravel 中返​​回数据库表名

如何使用左连接和内连接编写 laravel 查询?

如何在 Laravel 中使用 eloquent 执行多表选择

如何在不使用Eloquent ORM时构建Laravel应用程序