Laravel 8 如何连接 2 个表并检查值是不是存在

Posted

技术标签:

【中文标题】Laravel 8 如何连接 2 个表并检查值是不是存在【英文标题】:Laravel 8 How to join 2 tables and check if a value existsLaravel 8 如何连接 2 个表并检查值是否存在 【发布时间】:2021-07-29 20:19:42 【问题描述】:

我在查询 2 个表时遇到问题。

基本上我有一个“黑名单”表,其中包含 2 列“user_id”和“block_id”,其中“user_id”是当前用户,“block_id”是被阻止的用户。另一个表是“用户”,其中有注册用户的信息。

在我的站点我有一个搜索用户的页面,我的问题是如果id1阻止了id2,当id2搜索id1时它不应该显示,所以在'black_list'表中我会有这些值user_id = 1 和 block_list = 2

我尝试了很多方法,但我没有成功,你能帮帮我吗?对不起,我的英语

public function search(Request $request)
    $id= Auth::id();
    $query = $request->query('query');
    $utentis = DB::table('black_lists')
        ->join('users', 'users.id', '=', 'users.id')
        ->where('users.id', '!=', $id)
        ->where('users.name', 'like', '%' . $query . '%')
        ->where('black_lists.user_id', '!=', 'users.id')
        ->orWhere('users.cognome', 'like', '%' . $query . '%')
        ->where('black_lists.user_id', '!=', 'users.id')
        ->where('users.id', '!=', $id)
        ->orWhere('users.username', 'like', '%' . $query . '%')
        ->where('black_lists.user_id', '!=', 'users.id')
        ->where('users.id', '!=', $id)
        ->select('users.id', 'users.name', 'users.fotoProfilo')
        ->get(); 
    if ($utentis->count() > 0) 
        return response()->json($utentis);
       

【问题讨论】:

join('users', 'users.id', '=', 'users.id') 看起来不对。两个连接列之一应该来自black_lists 【参考方案1】:

我假设您在用户之间创建了多对多关系,并且 black_list 是一个数据透视表。


public function search(Request $request)

    $id = $request->id;
    return User::where('id', $id)
        ->whereDoesntHave('blocks', function($query) use ($id) 
             $query->where('user_id', '!=', $id);
        ),
    ]);

更新

// User.php
public function blocks()

    return $this
        ->belongsToMany(User::class, 'black_list', 'block_id', 'user_id')
        ->using(BlackList::class)
        ->withTimestamps();

注意事项:

    列名的顺序可能有误,因为我总是混合使用它们。查看文档了解更多信息。 如果您为数据透视表创建了模型,则需要添加->using(BlackList::class) 如果您有 BlackList.php,则需要将其扩展到 Pivot 而不是 Model。

【讨论】:

嗨,不,我没有这两个表之间的关系 表之间的关系应该是正确的方式,但我不能发展,你好心给我一个例子,我将不胜感激,谢谢【参考方案2】:

感谢两位的及时回复。不幸的是,它使用#gbalduzzi 解决方案返回null。我尝试附上表格的屏幕。 变量 $id = Auth::id(); enter image description here当我运行查询时,只有在 black_list 表中没有 user_id == “阻止我的用户 id”和 block_id == $ id 时,它才会返回用户配置文件。再次感谢您的帮助。

【讨论】:

【参考方案3】:

完美效果很好,非常感谢您的帮助

public function search(Request $request)


    $id= Auth::id();
    $query = $request->query('query');

    $utentis = User::where('users.id', '!=', $id)
           ->where(function ($filter) use ($query) 
            $filter->where('users.name', 'like', '%' . $query . '%')
              ->orWhere('users.cognome', 'like', '%' . $query . '%')
              ->orWhere('users.username', 'like', '%' . $query . '%');
            )
            ->whereDoesntHave('blocks', function ($query) use ($id) 
            $query->where('black_lists.block_id','=', $id)
            ->where('black_lists.user_id','!=', 'users.id');
            )
            
        ->select('users.id', 'users.name', 'users.fotoProfilo')
        ->get();
  
        //Log::debug($utentis);
        if ($utentis->count() > 0) 
            return response()->json($utentis);
          
             

【讨论】:

以上是关于Laravel 8 如何连接 2 个表并检查值是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:检查是不是有新项目添加到 db 表并安排一个工作给用户发送电子邮件

连接 2 个表并计算 SQL 中特定字段的出现次数

SQL - 连接 2 个表并返回 2 行之间的值差异

连接表并查看 laravel 8 中每个类别名称中的类别计数

连接 2 个表并根据其关联 ID 重复显示同一列

SQL 连接两个表并检查两个表中的每个值是不是存在