首页 > 解决方案 > 在 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;

}

标签: mysqllaraveleloquentmodelforeign-keys

解决方案


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

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

推荐阅读