【发布时间】:2013-12-02 15:25:07
【问题描述】:
我的数据库表如下:
images:
id name url etc
places:
id image_id name url etc
image_place:
image_id place_id
地点和图像具有多对多关系,但每个地点也分配有一个图像,用作列表中的缩略图。因此,一个地方可能“属于”一个一对多关系中的图像。因此我在 Laravel 4 中尝试了这个:
模型/Place.php:
public function image() {
return $this->belongsTo('Image');
}
public function images() {
return $this->belongsToMany('Image');
}
但是当我尝试访问 $place->image 时,我收到一个错误:“调用未知方法 getResults()。”
我做了一些实验并找到了这些解决方法:
如果我删除 images() 方法,$place->image 会按预期工作。我目前不使用 images(),所以这是我目前的解决方案,但我当然希望两者都可用。
如果我将 image() 函数替换为: return Image::where('id', $this->image_id)->first();然后我可以通过 $place->image() 访问该对象。但是我不能进行预加载,这很重要,因为我在长长的结果列表中使用缩略图。另外,我不喜欢只为这个属性使用 method() 语法。
我也尝试重命名方法,例如image() 和 photos(),但没有区别。
在 Laravel 中无法访问具有不同类型关系的同一个模型,还是我遗漏了什么?
【问题讨论】:
-
你的
images()应该是hasMany,你有它作为belongsToMany。 -
我认为一个地方在这里“有一个”图片,而不是相反。
-
Sajan:请参阅我对您的回答的评论。 @matpop,我不这么认为,因为:1.“hasOne”仅用于文档中的一对一关系。 2. image() 目前正在按预期与 belongsTo 一起工作。 3. 它与一对多 (four.laravel.com/docs/eloquent#relationships) 下的文档中的示例类似:就像一个帖子有很多 cmets,一张图片可能有很多(= 是很多地方的缩略图)。在示例中,cmets 表有一个 post_id 列和 belongsTo 一个 Post,而我的 places 表有一个 image_id 列和 belongsTo 一个 Image。