Laravel:如何获取未出现在表B中的表A用户集合?
在Laravel中获取未出现在表B的用户
嘿,针对你给出的表结构,要从表A(用户表)里找出那些从未出现在表B的user字段中的用户,我给你整理了几种Laravel里常用的实现方式:
方法一:使用查询构造器(Query Builder)
如果不想用ORM模型,直接用DB门面写原生风格的查询就很方便,核心思路是用whereNotIn配合子查询,先取出表B里所有的用户ID,再筛选表A中不在这个集合里的记录:
$users = DB::table('A') ->whereNotIn('Id', function ($query) { $query->select('user') ->from('B'); }) ->get();
执行后就能得到Tom(Id=2)和Paul(Id=4)这两个符合要求的用户。
方法二:使用Eloquent模型(推荐,更贴合Laravel风格)
如果已经定义了对应的Eloquent模型(比如User对应表A,Item对应表B),那用ORM的关联方法会更优雅:
首先在User模型里定义和Item的关联关系:
// app/Models/User.php public function items() { // 关联表B的user字段到当前模型的Id字段 return $this->hasMany(Item::class, 'user', 'Id'); }
然后直接用doesntHave方法就能筛选出没有关联任何Item的用户:
$users = User::doesntHave('items')->get();
要是之后需要加更复杂的筛选条件,还可以用whereDoesntHave,不过当前需求用doesntHave就完全够用啦。
另外还有一种性能更优的写法,用whereNotExists子查询,适合表B数据量较大的场景:
$users = User::whereNotExists(function ($query) { $query->select(DB::raw(1)) ->from('B') ->whereColumn('B.user', 'users.Id'); })->get();
以上几种方法都能实现你的需求,你可以根据项目的实际情况选择最合适的~
内容的提问来源于stack exchange,提问作者Louisdrake
相关产品推荐
相关产品推荐

