如何从 laravel 模型中获取外键?

How to get foreign keys from laravel model?

有没有办法从 laravel 模型中获取外键? 我发现您可以使用 getKeyName(); 方法获取主键,但还没有找到任何获取外键的解决方案。

例如class Grades有如下关系:

public function student()
{
    return $this->belongsTo(Student::class, 'student_id', 'id');
}
public function subject()
{
    return $this->belongsTo(Subject::class, 'subject_id', 'id');
}

以及以下迁移:

Schema::create('grades', function (Blueprint $table) {
    $table->id();
    $table->unsignedBigInteger('student_id');
    $table->unsignedBigInteger('subject_id');
    $table->float('grade', 3, 1);
    $table->dateTime('graded_at');
    $table->timestamps();

    $table->foreign('student_id')
        ->references('id')
        ->on('students');
    $table->foreign('subject_id')
        ->references('id')
        ->on('subjects');

    $table->unique(['student_id', 'subject_id']);
});

期望的结果类似于:

$grades= new Grades();
return $grades->getForeignKeys();

// desired result
// [
// student_id,
// subject_id
// ]

有没有办法在不改变模型的情况下获取所有外键

Eloquent 是一个非常神奇的 ORM,它几乎不需要任何配置就可以将您的数据库同步到您的模型,但这种自由是有代价的:它不知道您的数据库模型。

没有从模型中获取外键名称的自动方法。但是你可以自己让它工作:

像您一样定义关系 returns 关系对象,例如 BelongsTo. Relationship objects have methods to get foreign keys that you defined like getForeignKeyName

所以你可以这样做:

$grade = Grade::findOrFail($id);
$fks = [];
$fks [] = $grade->student()->getForeignKeyName();
$fks [] = $grade->subject()->getForeignKeyName();

另一种方法是在您的模型中添加一个属性来存储您要使用的外键,也将其用作您的关系定义的单一真实来源,如下所示:

class Grades extends Model{

     protected $foreignKeys = [
        'subject' => 'subject_id', 
        'student' => 'student_id'
    ];

    public function student()
    {
        return $this->belongsTo(Student::class, $this->foreignKeys['student'], 'id');
    }

    public function subject()
    {
        return $this->belongsTo(Subject::class, $this->foreignKeys['subject'], 'id');
    }
     
    public function getForeignKeys(){
        return array_values($this->foreignKeys);
    }
}