请教,Laravel 多对多查询如何实现?

users 表
id,
realname,
mobile
departments表
id,
name
department_user表
user_id,
department_id

请问如何查询出 department_id = 1 的所有用户,并实现用户列表翻页

按照文档的方法我都试过了,没达到我的要求。假如users表有10000个用户,其中属于 department_id = 1 的部门有1000个,取出这个1000个用户分页成每页15个用户,每条数据 含有 realname, mobile, 部门名称

黄威
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 16
Department::where()->users()->paginate()

前提是你定义好关联关系,关联关系请看文档

6年前 评论
黄威

@DavidNineRoc 这不是我想要的结果

6年前 评论
RyanFeng

两个模型的建立:

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    //
}

class Department extends Model
{
    //为了确定连接表表名,Eloquent 会按照字母顺序合并两个关联模型的名称。 当然,您可以自由地覆盖这个约定,通过给 `belongsToMany` 方法指定第二个参数实现
    public function users()
    {
        return $this->belongsToMany(__NAMESPACE__ . '\User', 'department_user', 'department_id', 'user_id');
    }
}

可以参考文档
多对多中文
英文

使用方法:

$department = Department::with('users')->find(1);

print_r($department->users);

6年前 评论
KayuHo

User.php

public function departments()
{
    $this->belongsToMany(Department::class, 'department_user')
}

Department.php

public function users()
{
    $this->belongsToMany(User::class, 'department_user')
}

定义好关联之后

$department = Department::find(1);
$users = $department->users; // 这里的 users 就是 department 为 1的用户

后面分页 可以自己再连接 paginate()

6年前 评论
黄威

@咚咚咚咚丶锵 按照文档的方法我都试过了,没达到我的要求。假如users表有10000个用户,其中属于 department_id = 1 的部门有1000个,取出这个1000个用户分页成每页15个用户,每条数据 含有 realname, mobile, 部门名称

6年前 评论
KayuHo

@hihuangwei 额...,你关联用户可以取出来吗?

6年前 评论

https://learnku.com/docs/laravel/5.5/eloquent-rela...
應該可以參考這段

// Retrieve all posts with at least one comment containing words like foo%
$posts = Post::whereHas('comments', function ($query) {
    $query->where('content', 'like', 'foo%');
})->get();
6年前 评论

$department->users()->with('anything')->paginate(15) @咚咚咚咚丶锵 说的没问题。

6年前 评论
黄威

@咚咚咚咚丶锵 搞定了 感谢感谢

6年前 评论
黄威

@咚咚咚咚丶锵 请教 如何同时获取 department_id 为 1 2 部门的用户列表 并分页

6年前 评论
KayuHo

@hihuangwei

use App\User;
use App\Department;

$department1_users = Department::find(1)->users->pluck('id')->toArray();

$department2_users = Department::find(2)->users->pluck('id')->toArray();

$user_id =  array_intersect($department1_users, $department2_users);

$users = User::whereIn('id', $user_id)->paginate(10); // 这个 users 集合就是同时在部门 1, 2 的集合

dd($users);

我是这么想的,先取出部门1的用户,再取出部门2的用户,然后两个对比,取出相同的。
代码写起来比较弱,有大神有更好的方法可以发出来学习一下哈。:smile:

6年前 评论
TimJuly

没有这么复杂吧

$ids = [1, 2];
$users = User::whereHas('departments', function ($q) use ($ids) {
    return $q->whereIn('id', $ids);
})->paginate();
6年前 评论
KayuHo

@TimJuly 学习了

6年前 评论
黄威

@TimJuly 感谢 学习了

6年前 评论

@TimJuly 这样会报错吧,没有指定id是哪个表

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!