【问题标题】:Use Pivot Table to Fetch Data from Main Table使用数据透视表从主表中获取数据
【发布时间】:2019-01-28 23:48:51
【问题描述】:

我正在使用两个表和一个数据透视表

表 1 名为 calendars

表 2 名为 calendar_groups

数据透视表calendar_calendar_group

我正在尝试根据数据透视表中的 where 值从表 1 中获取数据。其中calendar_groups_id = 1 然后使用calendar_id 从表1 中获取数据。我无法让它工作。

$event = new Calendar();
$event->orderBy('start', 'asc')
    ->whereHas('calendar_groups', function ($q) {
        $q->wherePivot('calendar_groups_id', '=', '1');
    })->with('calendar_groups')
    ->first();

这给了我以下错误:

SQLSTATE[42S22]:未找到列:1054 未知列 'pivot' in 'where子句'

这是关系:

public function calendar_groups()
    {
        return $this->belongsToMany(CalendarGroup::class);
    }

非常感谢您的帮助。

【问题讨论】:

  • 发布您的Calendar 模型或至少发布关系定义。
  • 假设calendar_groups 中的主键是id,请尝试$q->where('id', '=', '1');
  • @brnd0 我从日历模型中添加了关系

标签: laravel laravel-5 eloquent


【解决方案1】:

我认为@Tpojka 就在这里。如果您尝试获取属于所需 CalendarGroup 的日历实例,则替换代码应如下所示:

$event = new Calendar();
$group = 1;
$event->orderBy('start', 'asc')
    ->whereHas('calendar_groups', function ($q) use ($group) {
        //$q->wherePivot('calendar_groups_id', '=', $group);
        $q->where('id', '=', $group);
    })->with('calendar_groups')
    ->first();

如果我正确阅读了文档,wherePivot() 应该这样使用:

$event = new Calendar();
$event->calendar_groups()->wherePivot('some_pivot_column',1)->get();

但这会返回CalendarGroup 实例。

如果您想通过 Eloquent 完成此操作,但又不想一直使用 CalendarGroup,那么您可能需要为数据透视表创建一个模型(我们称之为 CalendarCalendarGroupPivot)并添加另一个关系(hasMany('CalendarCalendarGroupPivot')) 到您的Calendar 模型。

【讨论】:

    【解决方案2】:

    好的,终于成功了。

    我使用了您的建议,但仍有一小部分不明白。 当我使用提出的建议时:

    $event = new Calendar;
                    $event->orderBy('start', 'asc')
                ->whereHas('calendar_groups', function($q) {
                        $q->where('calendar_group_id', '=', '1');
                    })->with('calendar_groups')
    
                ->first();
    

    我得到一个空集合。

    但是如果我运行这个:

    $event = Calendar::orderBy('start', 'asc')
            ->whereHas('calendar_groups', function($q) {
                    $q->where('calendar_group_id', '=', '1');
                })->with('calendar_groups')
    
            ->first();
    

    我得到了想要的结果

    谁能告诉我两者之间的区别,以便我可以从中学习?

    【讨论】:

      猜你喜欢
      • 2020-11-09
      • 2019-09-29
      • 1970-01-01
      • 2017-05-17
      • 2017-07-25
      • 2016-11-21
      • 2019-07-25
      • 1970-01-01
      • 2022-07-21
      相关资源
      最近更新 更多