Laravel ManyToMany检索数据

时间:2016-09-23 10:50:34

标签: laravel eloquent relationships

我是Laravel的新手并且试图与人际关系一起工作。

我有2张桌子: 会员 组

和数据透视表:member_group

一个成员可以属于许多组,一个组可以有许多成员。

编辑成员时,我会为组创建复选框。

我需要将成员已经拥有的那些标记为“已检查”

我的编辑方法:

 public function edit($id)
{
    $cities = City::orderBy('city_name')->pluck('city_name', 'city_id');
    $member = Member::findOrFail($id);
    $groups = Group::all();

    return view('members.edit', compact('member', 'cities', 'groups'));
}

在我的edit.blade中:

@foreach($groups as $group)
 <?php $exists = $member->groups()->where('groups.group_id', $member->group_id); ?>
 @if($exists)
 <input type="checkbox" name="groups[]" value="{{ $group->group_id }}" checked> {{ $group->group_name }}
 @else
 <input type="checkbox" name="groups[]" value="{{ $group->group_id }}"> {{ $group->group_name }}
 @endif

...

检查所有复选框,但该成员不属于所有组。

看看这篇文章:Stackoverflow post我几乎尝试了他们在那里提供的所有东西,只有错误。唯一有效的是这一个: $ exists = $ member-&gt; groups-&gt; contains($ group-&gt; group_id);

不知道是否有浪费,它是唯一有效的。

1 个答案:

答案 0 :(得分:1)

我认为,在您的刀片$exists = $member->groups()->where('groups.group_id', $member->group_id);中,您应该使用group.group_id代替groups.group_id并使用first()方法。

$exists = $member->groups()->where('group.group_id', $member->group_id)->first();

更新

你能试试吗?

$member = Member::findOrFail($id)->with(['groups'=>function($query){
    $query->selectRaw('groups.group_id');
}])->first();

在刀片中:

$exists = $member->groups()->whereIn('groups.group_id', $member->groups)->first();