Laravel 雄辩的 ORM 关系
Posted
技术标签:
【中文标题】Laravel 雄辩的 ORM 关系【英文标题】:Laravel Eloquent ORM Relationship 【发布时间】:2014-01-02 06:17:28 【问题描述】:这应该真的简单,但我似乎无法弄清楚。
有两个表:
`images`
|- `id`
|- `path`
|- `name`
`foods`
|- `id`
|- `image_id`
还有两种型号:
class Image extends Eloquent
public function food()
return $this->belongsToMany('Food');
class Food extends Eloquent
public function image()
return $this->hasOne('Image');
这个想法是每个food
都有一个image
通过其foods
表行中的image_id
列与之关联。一个image
可以关联多种食物。
我希望能够在控制器中做这样的事情:
$food = Food::with('image')->find(1);
...但是,当然,我收到以下错误:
SQLSTATE[42S22]:未找到列:1054 'where 子句'中的未知列'images.food_id'(SQL:select * from images
where images
.food_id
in (1))
...因为 Eloquent 希望每个 image
都有一个 food_id
。但是,当然,image
s 没有food_id
s。食物有image_id
s。
请帮助沮丧的程序员。 :)
谢谢!
编辑:
非常感谢你,决斗者。
我已将我的模型更新为:
class Image extends Eloquent
public function food()
return $this->hasMany('Food');
class Food extends Eloquent
public function image()
return $this->belongsTo('Image');
...现在Food::with('image')
调用有效。
我真的不明白为什么“食物”属于“图像”……也许有人可以解释为什么语法与这里的语法不匹配?
【问题讨论】:
【参考方案1】:虽然在语法上听起来应该是 hasOne
关系,但您的数据设置方式实际上是 belongsTo
关系。
即,食物表有外键,所以它@987654323@ 无论外键指向什么
此外,图像模型的情况正好相反,belong to
没有任何作用,因为不涉及外键或数据透视表。相反,它has many
foods
什么是反向语法?
在您的情况下,语法/句法似乎有点倒退,纯粹是因为在大多数系统中,您会期望食物有很多图像,而不是相反。它经常会变得很棘手,这就是为什么总是值得忘记模型名称而只考虑谁拥有外键。
【讨论】:
非常感谢,伙计。工作完美。我真的不明白为什么语法与语法不匹配?但是,我很高兴它有效。 酷。在大多数情况下,确实如此,只是数据的结构方式与正常情况有些不同。在大多数其他系统中,您会认为一种食物会有多个图像。 如果一种食物确实有多个图像......我必须有第三张桌子,对吧?假设foods_images
。然后,我是否还需要一个FoodImage
模型来将所有内容联系在一起?
如果食物有多个图像,但图像也属于多个食物,那么是的,您需要一个数据透视表。
我明白了,现在说得通了。再次感谢,你摇滚! :)以上是关于Laravel 雄辩的 ORM 关系的主要内容,如果未能解决你的问题,请参考以下文章
laravel 4 - 如何限制(采取和跳过)雄辩的 ORM?