如何使用Eloquent链接表?

时间:2015-03-25 12:12:04

标签: laravel laravel-4 eloquent laravel-5

在我的Laravel 4应用程序中,我有两个模型:Country和Grade将它们写成:

Country.php:

class Country extends Eloquent {
    protected $fillable = [];

    public function grades()
    {
        return $this->hasMany('Grade', 'title');
    }
}

Grade.php:

class Grade extends Eloquent {
    protected $fillable = [];

    public function country()
    {

        return $this->belongsTo('Country');
    }
}

当我试图获得特定国家的所有成绩时:

return Response::json(Country::find($country_id)->grades());

但这会导致空对象{}

我正在使用多对多链接表:

Schema::create('countries_grades', function(Blueprint $table)
        {
            $table->increments('id');
            $table->integer('country_id');
            $table->integer('grade_id');
            $table->timestamps();
        });

看来laravel没有使用上面的表,实现这个查询的正确方法是什么?

修改

感谢下面的答案!但是我发现无论我做什么,如果我把评级称为方法,我会得到空物体:

return Response::json(Country::find($country_id)->grades());

这应该是:

return Response::json(Country::find($country_id)->grades);

否则,如果我对belongsToManyGrade

使用Country,那就很顺利

我希望这会有所帮助!

1 个答案:

答案 0 :(得分:2)

根据您的Schema,您正在尝试定义“多对多”查询,正确的方法是将调用返回到方法belongsToMany()。例如:

class Country extends Eloquent {
    protected $fillable = [];

    public function grades()
    {
        return $this->belongsToMany('Grade', 'countries_grades');
    }
}

和...

class Grade extends Eloquent {
    protected $fillable = [];

    public function country()
    {

        return $this->belongsToMany('Country', 'countries_grades');
    }
}

更新一对多关系

如果你想要达到的目标是一个国家有多个等级,一个等级属于一个国家,你必须做到以下几点。

country_id表中添加一个名为grades的整数字段,然后将以下关系添加到您的类中:

class Country extends Eloquent {
    protected $fillable = [];

    public function grades()
    {
        return $this->hasMany('Grade');
    }
}

和...

class Grade extends Eloquent {
    protected $fillable = [];

    public function country()
    {

        return $this->belongsTo('Country');
    }
}

然后,一个国家可以访问这样的成绩:

$country = Country::find(1);
$country->grades;

要获得成绩所属的国家,可以这样做:

$grade = Grade::find(1);
$grade->country;