如何在 laravel 查询生成器上获取主键名称

Posted

技术标签:

【中文标题】如何在 laravel 查询生成器上获取主键名称【英文标题】:How to get primary key name on laravel query builder 【发布时间】:2018-09-26 10:51:38 【问题描述】:

有没有办法使用 Laravel 查询构建器获取表的主键名称?我可以做类似的事情吗

$key = DB::table($someTable)->getPrimaryKey();

我查看了文档和 API,但找不到任何参考。

提前致谢。

【问题讨论】:

【参考方案1】:

您可以直接使用模式管理器获取表的索引数组:

$indexes = DB::connection()->getDoctrineSchemaManager()->listTableIndexes($table);

$indexes = Schema::getConnection()->getDoctrineSchemaManager()->listTableIndexes($table);

然后你可以得到一个与该索引键关联的列的数组:

$columns = $indexes[ 'primary' ]->getColumns();

此函数可用于查找您一无所知的表的主键或唯一键:

public function getTablePrimaryOrUniqueKey($table, $key='') 
    //get the array of table indexes
    $indexes = DB::connection()->getDoctrineSchemaManager()->listTableIndexes($table);

    //abort if there are no indexes
    if(!is_array($indexes)) return false;

    //set up the default array of index keys
    $keys = ['primary', 'unique'];

    //if a key was passed and it is valid, use it...but cast as an array
    if($key!='' && in_array($key, $keys)) $keys = (array) $key;

    //loop through the keys array
    foreach ( $keys as $key ) 
        //keep it honest
        if ( array_key_exists( $key, $indexes ) ) 
            //get the columns for this key
            $columns = $indexes[ $key ]->getColumns();

            //if we have an array of columns, we have what we need
            if ( is_array( $columns ) ) 
                return $columns;
            
        
    

    //if you got here, you did not get find what you were looking for
    return false;

【讨论】:

【参考方案2】:

Illuminate/Database/Eloquent/Model 类有一个getKeyName 函数,即public

在您的模型类中,您可以使用$this->getKeyName() 访问主键。

【讨论】:

我没有使用 Eloquent 模型。我想通过查询生成器来完成。 在这种情况下,我认为您需要使用一些 SQL。 Laravel 似乎没有开箱即用。 问题是基于查询生成器,请注意任何数据库模型!【参考方案3】:

我的做法是:

$result = DB::select(DB::raw("SHOW KEYS FROM $table WHERE Key_name = 'PRIMARY'"));
$primaryKey = $result[0]->Column_name;  

我用的是 mysql

【讨论】:

【参考方案4】:

您可以在模型上使用->getKey()

$someModel->getKey();

或者,如果您只是想获取列的名称,而没有模型的实例:

app(App\Model::class)->getKeyName()

【讨论】:

getKey 实际上是返回主键的值 您是否要获取列的名称?使用->getKeyName() 我没有使用 Eloquent 模型。我想通过查询生成器来完成。 这是不可能的。您可以通过SQL query 获取它。【参考方案5】:
$primary_key = app($builder->getModel())->getKeyName();

如果您在初始化查询生成器实例时引用了模型,则可以检索模型引用,然后使用它来获取 keyName。但是如果您只是直接调用了一个新的查询生成器,那么没有办法在不对表键进行选择的情况下查看主键,也许在子选择中?

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY'

【讨论】:

以上是关于如何在 laravel 查询生成器上获取主键名称的主要内容,如果未能解决你的问题,请参考以下文章

如何在执行查询之前从Laravel的查询生成器获取原始查询字符串?

如何在 laravel 中使用查询生成器根据 id 从多个表中获取数据

Laravel 查询生成器 - 日期现在在哪里使用碳

如何在 laravel 查询生成器中为 sql 选择列添加别名?

Laravel数据库查询生成器错误与表名称

如何在 Laravel 5 上获取具有关系的字段的名称?