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。但是,当然,images 没有food_ids。食物有image_ids。

请帮助沮丧的程序员。 :)

谢谢!


编辑:

非常感谢你,决斗者。

我已将我的模型更新为:

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 关系。

即,食物表有外键,所以它@98​​7654323@ 无论外键指向什么

此外,图像模型的情况正好相反,belong to 没有任何作用,因为不涉及外键或数据透视表。相反,它has manyfoods

什么是反向语法?

在您的情况下,语法/句法似乎有点倒退,纯粹是因为在大多数系统中,您会期望食物有很多图像,而不是相反。它经常会变得很棘手,这就是为什么总是值得忘记模型名称而只考虑谁拥有外键。

【讨论】:

非常感谢,伙计。工作完美。我真的不明白为什么语法与语法不匹配?但是,我很高兴它有效。 酷。在大多数情况下,确实如此,只是数据的结构方式与正常情况有些不同。在大多数其他系统中,您会认为一种食物会有多个图像。 如果一种食物确实有多个图像......我必须有第三张桌子,对吧?假设foods_images。然后,我是否还需要一个FoodImage 模型来将所有内容联系在一起? 如果食物有多个图像,但图像也属于多个食物,那么是的,您需要一个数据透视表。 我明白了,现在说得通了。再次感谢,你摇滚! :)

以上是关于Laravel 雄辩的 ORM 关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 中雄辩的 ORM 同表关系

Laravel 雄辩的一对一通过(级别/树)关系

Laravel 雄辩的 ORM 群在哪里

laravel 4 - 如何限制(采取和跳过)雄辩的 ORM?

从 mysql 迁移到 postgresql 时,Laravel 雄辩的 ORM 不起作用

雄辩的ORM laravel 5获取ID数组