Mysql Laravel 8如何联接两个表并检查值是否存在

Mysql Laravel 8如何联接两个表并检查值是否存在,mysql,laravel,vue.js,Mysql,Laravel,Vue.js,我在查询两个表时遇到问题 基本上,我有一个“黑名单”表,有两列“用户id”和“块id”,其中“用户id”是当前用户,“块id”是被阻止的用户。另一个表是“用户”,其中包含注册用户的信息 在我的站点中,我有一个搜索用户的页面,我的问题是,如果id1阻止了id2,那么当id2搜索id1时,它不应该显示出来,所以在“黑名单”表中,我会有这些值​​用户标识=1,块列表=2 我试过很多方法,但都没有成功,你能帮我吗?请原谅我的英语 public function search(Request $reque

我在查询两个表时遇到问题

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

在我的站点中,我有一个搜索用户的页面,我的问题是,如果id1阻止了id2,那么当id2搜索id1时,它不应该显示出来,所以在“黑名单”表中,我会有这些值​​用户标识=1,块列表=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);
    }   
}

我假设您在用户之间创建了一个多对多关系,黑名单是一个透视表


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();
}
注:

  • 列名的顺序可能不正确,因为我总是把它们混在一起。有关更多信息,请参阅文档
  • 如果您为透视表创建了模型,则需要使用(BlackList::class)
  • 如果您有BlackList.php,则需要将其扩展到Pivot而不是Model

  • 谢谢你们两位的及时回复。不幸的是,它使用#gbalduzzi解决方案返回null。我试着在桌子上加一个屏幕。 变量$id=Auth::id();
    当我运行查询时,只有在黑名单表中没有用户id==“阻止我的用户id”和block\u id=$id时,它才会返回用户配置文件。再次感谢您的帮助。

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

    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);
            }  
                 
    }
    

    您好,不,我没有两个表之间的关系,表之间的关系应该是正确的方式,但我无法发展,请您为我举个例子,我将不胜感激,谢谢我更新了我的答案
    join('users','users.id','=','users.id')
    看起来有误。两个联接列中的一个应来自
    黑名单