在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();
}
但是,如果您想在生产中使用它,请先进行一些广泛的测试