Laravel 5 数据透视表问题

Posted

技术标签:

【中文标题】Laravel 5 数据透视表问题【英文标题】:Laravel 5 pivot table issue 【发布时间】:2015-09-21 09:37:38 【问题描述】:

我不确定如何解释我的问题,但我会试一试。

我正在使用 Laravel 5,我有 3 个表:

页 语言 语言页面

这是我的模型的样子: 页面模型:

public function languages()

    return $this->belongsToMany('App\Language', 'language_page')
                ->withPivot('title', 'content', 'slug', 'meta_title', 'meta_description')
                ->orderBy('main', 'desc');

语言模型:

public function pages()

    return $this->belongsToMany('App\Page')
                ->withPivot('title', 'content', 'slug', 'meta_title', 'meta_description');

我想要从页表中返回一条记录,其中 language_id 是某个 id,slug 是某个文本。

这是我目前得到的:编辑:

Page::with(['languages' => function($q) use($language_id, $slug) 
                        $q->where('language_id', $language_id);
                        $q->wherePivot('slug', $slug);
                    ])
                    ->first();

我的问题:如何添加带有列 slug 的 where 子句(来自数据透视表 language_page)?

我希望这有任何意义..

【问题讨论】:

【参考方案1】:

Eloquent 的 BelongsToMany 类有一个

wherePivot()

允许您将 WHERE 子句直接应用于数据透视表的方法,请参阅:

https://github.com/laravel/framework/blob/5.1/src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php#L111

【讨论】:

我更新了我的问题,这就是我将其更改为的内容,尽管它的输出将始终是第一条记录(它忽略了 where 子句之类的东西?) 你能检查一下生成了什么SQL吗?只需将 ->first() 替换为 ->toSql() 和 dd() 该值 hm 很奇怪.. 这就是我得到的:“select * from pages”,是不是因为我使用的是语言中的 where,而不是直接在 pages 表本身中? 您确定结果无效吗?您按 language_id 和 slug 过滤,因此对于给定的 language_id,似乎只有一个带有给定 slug 的页面,对吧? 我第一次没有正确刷新,上面代码中 dd() 的输出是一个 id 为 1 的页面(第一条记录,并且带有 slug/language_id whereclause它应该是页面 id 2),如果我检查 dd() 语言中的关系结果为空:S

以上是关于Laravel 5 数据透视表问题的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.4 如何更新数据透视表?

Laravel 5 hasManyThrough 数据透视表

Laravel 5 - 从数据透视表额外属性获取属性

Laravel 5.8 在数据透视表上保存一对多关系

Laravel 5.1 - 3个表之间的数据透视表

如何在 laravel 5 中使用 Eloquent 更新数据透视表