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 表并安排一个工作给用户发送电子邮件