在Laravel 4中的多对多关系上使用不同的列
我在一个项目中遇到过这样一种情况:我需要在一个表上的主键和另一个表上的索引列(不是主键)之间建立关系。以下是数据库布局的示例:在Laravel 4中的多对多关系上使用不同的列,laravel,many-to-many,eloquent,relationships,Laravel,Many To Many,Eloquent,Relationships,我在一个项目中遇到过这样一种情况:我需要在一个表上的主键和另一个表上的索引列(不是主键)之间建立关系。以下是数据库布局的示例: courses table id level resources table id courses_resources table course_level resource_id 在我的课程资源模型中,我有以下内容: public function courses(){ return $this->belongsToMany('Course', '
courses table
id
level
resources table
id
courses_resources table
course_level
resource_id
在我的课程资源模型中,我有以下内容:
public function courses(){
return $this->belongsToMany('Course', 'courses_resources', 'resource_id', 'course_level');
}
这很好用
在我的课程模式中,我有:
public function resources(){
return $this->belongsToMany('CourseResource', 'course_resources', 'course_level', 'resource_id');
}
这不管用。当我查看在数据库上执行的最后一个查询时,似乎Laravel正在使用课程ID搜索课程级别列。这是有意义的,但是有没有任何方法可以使用级别列来处理此关系?Eloquent BelongTomany取决于PKs,因此无法使用其方法来实现这一点 您需要为此自定义关系对象,它将检查给定字段,而不是主键 一个快速的解决方案是:
// Course model
public function getKey()
{
$relation = array_get(debug_backtrace(1, 2), '1.object', null);
if (method_exists($relation, 'getForeignKey')
&& $relation->getForeignKey() == 'courses_resources.course_level')
{
return $this->getAttribute('level');
}
return parent::getKey();
}
但是,如果您想在生产中使用它,请先进行一些广泛的测试