【问题标题】:Laravel ManyToMany retrieving dataLaravel 多对多检索数据
【发布时间】:2017-02-01 04:58:39
【问题描述】:

我是 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->groups->contains($group->group_id);

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

【问题讨论】:

  • 您能否发布一些代码或详细说明您卡在哪里?
  • 我的编辑方法:` public function edit($id) { $cities = City::orderBy('city_name')->pluck('city_name', 'city_id'); $member = Member::findOrFail($id); $groups = 组::all(); return view('members.edit', compact('member', 'cities', 'groups')); }` 我的刀片:
  • 请详细说明您的问题。 :)
  • :) 更新了我的问题。我忘了在这里评论细节有多难
  • 你想做什么$exists = $member-&gt;groups()-&gt;where('groups.group_id', $member-&gt;group_id);这里?

标签: laravel eloquent relationship


【解决方案1】:

我认为,在您的刀片 $exists = $member-&gt;groups()-&gt;where('groups.group_id', $member-&gt;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();

【讨论】:

  • 得到这个:SQLSTATE[42S22]:找不到列:1054 'where 子句'中的未知列'group.group_id'(SQL:选择groups.*,group_member.member_id as pivot_member_id, group_member.group_id as pivot_group_id from groups inner join group_member on groups.group_id = @9876543@39@.group_member @987654341. =@9876454340@ 1 和group.group_id 为空顺序,按group_name asc 限制1)(视图:C:\wamp\www\ccf.local\resources\views\members\edit.blade.php)
  • 将其更改为groups.group_id,现在没有选中任何复选框,但该成员属于2个组
  • @SigalZahavi 很抱歉我把 groupsvariable 混淆了,而不是表名
  • 我认为问题在于成员表中没有 group_id,有一个数据透视表。还是我错了?不要抱歉,感谢您的帮助!
  • 你能试试更新吗?不确定这是否会正确执行,没有检查。不过,你会明白的。
猜你喜欢
  • 2017-11-18
  • 2017-01-17
  • 2012-12-26
  • 2013-03-29
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多