【问题标题】:Laravel 5 pivot table issueLaravel 5 数据透视表问题
【发布时间】: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)?

我希望这有任何意义..

【问题讨论】:

    标签: php mysql laravel eloquent pivot-table


    【解决方案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
    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 2015-09-10
    • 2016-03-09
    • 1970-01-01
    • 2019-07-04
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多