为了练习,我正在Laravel中为一家出售培训课程的虚构公司制作一个Web应用程序。我有一张用于课程,场地和实例的表。实例定义了特定课程的日期和地点。例如,课程A可能会在2020年6月5日在纽约,伦敦在2020-07-02年等运行,等等。
我已经定义了这样的关系:
class Instance extends Model
{
public function courses(){
return $this->belongsTo(Course::class);
}
public function venues(){
return $this->belongsTo(Venue::class);
}
}
class Course extends Model
{
public function instances(){
return $this->hasMany(Instance::class);
}
}
class Venue extends Model
{
public function instances(){
return $this->hasMany(Instance::class);
}
}
课程表和场所表的id
是实例表中的外键。
我想获取与给定课程相关联的所有实例,并为每个课程引入场所,因此我在Tinker中尝试以下查询:
$instance = App\Instance::with('venues')->where('course_id','=',1)->get()
这给了我以下输出:
course_id: 1,
venue_id: 2,
date: "2020-11-04",
length: 0,
cost: 635.0,
created_at: "2020-05-26 13:35:06",
updated_at: "2020-05-26 13:35:06",
venues: null,
如您所见,venues
为空。我的问题是...为什么?
答案 0 :(得分:0)
问题是您赋予函数的复数名称。
内部的Laravel将查看函数名称并计算出应尝试使用的外键。因此,在您的情况下,它正在寻找“ venues_id”,因为“ belongs_to”关系应返回一条记录,而函数名称应为“ venue()”,那么Laravel将寻找“ venue_id”。
当然,您可以按需覆盖外键,而只是解释为什么它不起作用。