为什么这个雄辩的查询无法获得预期的结果?

时间:2020-06-01 12:19:13

标签: laravel eloquent

为了练习,我正在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为空。我的问题是...为什么?

1 个答案:

答案 0 :(得分:0)

问题是您赋予函数的复数名称。

内部的Laravel将查看函数名称并计算出应尝试使用的外键。因此,在您的情况下,它正在寻找“ venues_id”,因为“ belongs_to”关系应返回一条记录,而函数名称应为“ venue()”,那么Laravel将寻找“ venue_id”。

当然,您可以按需覆盖外键,而只是解释为什么它不起作用。