使用数据透视表从主表中获取数据

时间:2019-01-28 23:48:51

标签: laravel laravel-5 eloquent

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

表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'   “ where子句”

这是关系:

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

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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

$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模型中。

答案 1 :(得分:0)

好,终于可以正常工作了。

我使用了您的建议,但还是有些理解。 当我使用提出的建议:

$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();

我得到了预期的结果

有谁能够告诉我之间,我可以从中学到什么区别?