【问题标题】:How to query in pivot table laravel如何在数据透视表中查询 laravel
【发布时间】:2017-05-04 15:52:42
【问题描述】:

如果用户已经存在于组中,我如何在我的数据透视表中查询?

我有 USERS 表、GROUPS 表和 GROUP_USER 表。在存储两个表的 id 的组用户表中,如果他/她已经存在,我想检查我的情况,会有一条消息。

这是我当前查询语句的代码,用于检查它是否存在:

Group::where('user_id', '=', $user)
     ->where('group', '=', $group->user->id)
     ->first;

答案:

if ($group) { if ($group->users()->where('users.id', $user)->exists()) { Session::flash('info', 'You\'re already part of the group', $group->group_name); } else { $group->users()->attach($user); Session::flash('success', 'You are now part of the group' . ' ' . $group->group_name); } } elseif ($false) { Session::flash('danger', 'Invalid group code'); } return back();

【问题讨论】:

    标签: laravel eloquent laravel-5.2 pivot-table


    【解决方案1】:

    你可以试试:

    $group->users()->where('users.id', $user)->exists()
    

    要插入数据透视表,您可以使用attach 方法:

    $group->users()->attach($user_id)
    

    更新

    在 cmets 中,您的代码应为:

    if ($group) { 
        if($group->user()->where('users.id', $user)->exists()) {
            Session::flash('info', 'Already part of this group'); 
        } else {
            $group->users()->attach($user); 
            Session::flash('success', 'You are now part of the group!'); 
        }
    } else { 
        Session::flash('danger', 'Wrong Group Code!'); 
    }
    return redirect()->back(); 
    

    【讨论】:

    • 我收到了与此语法相同的错误“重复条目 '2-3' for key 'PRIMARY' (SQL: insert into group_user (created_at, group_id, updated_at, user_id) 值 (2016-12-19 23:12:05, 3, 2016-12-19 23:12:05, 2))" "
    • 这个插入查询是从哪里进来的?
    • $user = Auth::user()->id; $group_code = $request['group_code']; $group = Group::where('group_code', '=', $group_code)->first(); if ($group) { $group->users()->attach($user); Session::flash('success', '你现在是小组的一员!');返回重定向()->返回(); }elseif (Group::user()->where('id', $user)->exists()){ Session::flash('info', '已经是这个组的一部分'); } else { Session::flash('danger', 'Wrong Group Code!'); }
    • 您的Group::user()->where('id', $user)->exists() 是问题所在。使用我的第一个代码。
    • 我仍然收到同样的错误。数据透视表包含两个主键(复合键)group_id 和 user_id 以及时间戳
    【解决方案2】:

    您可以像这样使用whereHas() 方法:

    Group::whereHas('users', function($q) use($user) {
        $q->where('id', $user->id); // check for single user id
        $q->whereIn('id', $user_ids_arr); // or use whereIn & pass array of user ids
    });
    

    或者,如果您想要 boolean 作为回报,您可以使用 exists() 方法,如下所示:

    $group = Group::find($group_id);
    $user_exists = $group->users()->where('id', $user_id)->exists(); 
    // return 'true' if user exits else returns 'false'
    

    更新

    如果您想将用户与组关联,您可以像这样使用attach()

    $group->users()->attach($user_id);
    

    查看更多关于Updating Many to Many Relationships

    更新代码 - 评论

    $user_arr = $group->users->pluck('id')->all(); // returns an array
    $valid_user = in_array($user->id, $user_arr); // true / false
    
    if ($group) {
        if($valid_user) {
            Session::flash('info', 'Already part of this group');
        } else {
            $group->users()->attach($user->id);
        }
    } else {
        Session::flash('danger', 'Wrong Group Code!');
    }
    
    return redirect()->back();
    

    希望这会有所帮助!

    【讨论】:

    • 第二个返回错误“SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2-3' for key 'PRIMARY' (SQL: insert into group_user (created_at, group_id, updated_at, user_id) 值 (2016-12-19 23:12:05, 3, 2016-12-19 23:12:05, 2))"
    • 我不知道为什么 $users = User::pluck('id');第一次使用 whereHas() 时不起作用
    • 据我所知,您正试图插入表中,而我给您的是从 DB 读取的查询。?
    • 您不能将pluck 应用于eloquent 作为其收集方法,您做错了。你能指定你想用代码做什么吗?
    • 是的,我试图将 id 插入数据透视表。组表有一个字段 user_id 是创建组的关系。我的数据透视表包含加入或已经成为该组的用户 ID 和组 ID。
    猜你喜欢
    • 2020-08-09
    • 2015-08-06
    • 2018-11-11
    • 2015-06-24
    • 1970-01-01
    • 2015-12-28
    • 2019-02-27
    • 2015-09-30
    相关资源
    最近更新 更多