在我的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);
否则,如果我对belongsToMany
和Grade
Country
,那就很顺利
我希望这会有所帮助!
答案 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;