Php Laravel第二个DB连接选择并按外键值过滤
我有这样的情况: 我在我的laravel应用程序中使用了第二个DB。我使用此方法连接到它并修改/选择数据:Php Laravel第二个DB连接选择并按外键值过滤,php,mysql,sql,laravel,Php,Mysql,Sql,Laravel,我有这样的情况: 我在我的laravel应用程序中使用了第二个DB。我使用此方法连接到它并修改/选择数据: $result = DB::connection('mysql_live')->table('users_album') ->where('isApprove', 'Pending')->count(); 我有一个users表,一个用户可以有许多相册图像,因此我有一个users\u相册表。用户可以是活动的或非活动的 表users\u album有一列users\u id
$result = DB::connection('mysql_live')->table('users_album')
->where('isApprove', 'Pending')->count();
我有一个users
表,一个用户可以有许多相册图像,因此我有一个users\u相册
表。用户可以是活动的
或非活动的
表users\u album
有一列users\u id
,因此我知道哪个相册图像属于哪个用户
现在我需要统计所有活跃用户的相册图像
我可以用ofc。选择所有处于活动状态的用户,并将其id放入一个数组中,然后使用->进行筛选,其中:
$activeUsers = DB::connection('mysql_live')->table('users')
->where('active', '!=', 'inactive')->pluck('id')->toArray();
$result = DB::connection('mysql_live')->table('users_album')->where('isApprove', 'Pending')
->whereIn('user_id', $activeUsers)->count();
但这需要很长时间,如果我选择整个数据集,就会失败,因此显然这不是解决问题的方法
在伪代码中,我需要如下内容:
$result = DB::connection('mysql_live')->table('users_album')->where('isApprove', 'Pending')
->where(USER WITH ID USER_ID IS ACTIVE)->count();
$result_ = array_unique(DB::connection('mysql_live')->table('users_album')->where('isApprove', 'Pending')->pluck('user_id')->toArray());
$users = array_unique(DB::connection('mysql_live')->table('users')->whereIn('id', $result_)->where('active', '!=', 'inactive')->pluck('id')->toArray());
$result = DB::connection('mysql_live')->table('users_album')->where('isApprove', 'Pending')->whereIn('user_id', $users)->count();
编辑:
两个表users
和users\u album
都存储在同一个数据库中,并且具有关系
我之所以提到第二个DB,是因为我不使用雄辩的laravel风格,例如,我不能:UserAlbum::where('isApprove','Pending')->count()代码>
编辑
我找到了一个“黑客”解决方案,但很难相信必须这样做:
$result = DB::connection('mysql_live')->table('users_album')->where('isApprove', 'Pending')
->where(USER WITH ID USER_ID IS ACTIVE)->count();
$result_ = array_unique(DB::connection('mysql_live')->table('users_album')->where('isApprove', 'Pending')->pluck('user_id')->toArray());
$users = array_unique(DB::connection('mysql_live')->table('users')->whereIn('id', $result_)->where('active', '!=', 'inactive')->pluck('id')->toArray());
$result = DB::connection('mysql_live')->table('users_album')->where('isApprove', 'Pending')->whereIn('user_id', $users)->count();
第一步:我从相册图像中提取所有用户id
第二步:我只选择用户,其中id在先前提取的id数组中,另外我按活动列过滤并再次提取id
第三步:现在,我可以通过使用先前提取的活动用户数组对计数查询进行额外过滤,来计算活动用户的相册图像数。尝试使用连接:类似于:
$activeUsers = DB::connection('mysql_live')->table('users_album')->join('users','users.id','=','users_album.users_id')
->where('users.active', '!=', 'inactive')->count();
你应该注意你的索引。用户id不好-用户id应该是正确的
编辑:这是一个非常好的例子!
你的问题是什么?如果所有内容都存储在第一个数据库中,您会怎么做?使用适当的索引怎么样?@Nico Haase这些东西都存储在同一个目录中DB@NicoHaase问题是:我需要统计所有的相册图像,它们属于活跃用户,但这不起作用。我假设是因为我使用了一个辅助连接,它不使用雄辩。关系在数据库中定义,但在应用程序中未定义。例如,如果我有:->hasMany('AlbumImage')代码>和->属于(“用户”)代码>没有定义的关系并不重要,因为关系是在连接中特别指出的。这工作非常好-只是尝试它没有任何问题!你试过了吗?我不这么认为。。。如果你这样做了,你会犯什么错误?我用两张图片更新了我的答案,你可以看到它在工作。我试过了,但它的条目太多了。就我而言,结果应该是171。但它有20多万条参赛作品。我会再给你一次机会让你知道。谢谢你的时间。好的-它应该按预期工作。数据库中的外键可能有问题?我现在有时间再看一遍。我太快放弃了你的解决方案,因为我有一个很好的解决办法。缺少以下内容:->其中('users\u album.isApprove','Pending')
。谢谢