如何从 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);
}
}
有没有办法从 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);
}
}