【问题标题】:Laravel 4 Eloquent: multiple relationship methods referencing the same model?Laravel 4 Eloquent:引用同一模型的多个关系方法?
【发布时间】: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()。”

我做了一些实验并找到了这些解决方法:

  1. 如果我删除 images() 方法,$place->image 会按预期工作。我目前不使用 images(),所以这是我目前的解决方案,但我当然希望两者都可用。

  2. 如果我将 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。

标签: php orm laravel-4


【解决方案1】:

你的images() 应该是hasMany,你有它作为belongsToMany。我假设您已经正确构建了数据库架构。

假设

places 表中有 image_id 列用于您使用的单个图像。

images 表的列 place_id 与图像相关联的位置。

public function image()
{
    return $this->belongsTo('Image');
}

public function images()
{
    return $this->hasMany('Image');
}

【讨论】:

  • 我使用belongsToMany是因为它是一个多对多的关系,你可以从我的第三个表“image_place”中看到。请参阅four.laravel.com/docs/eloquent#relationships 的文档:“我们可以使用 belongsToMany 方法定义多对多关系。”你的第二个假设是不正确的。一张图片可能有很多地方(地方可以指场地和建筑物,因此可以想象一张城市天际线的照片,其中包括很多摩天大楼)。
猜你喜欢
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 2021-08-27
  • 2023-03-27
  • 1970-01-01
  • 2020-03-27
  • 2015-04-05
  • 1970-01-01
相关资源
最近更新 更多