【发布时间】:2019-08-08 12:24:45
【问题描述】:
我有这种情况:
我在我的 laravel 应用程序中使用了第二个数据库。我使用这种方法连接到它并修改/选择数据:
$result = DB::connection('mysql_live')->table('users_album')
->where('isApprove', 'Pending')->count();
我有一个users 表,一个用户可以有许多专辑图片,所以我有一个users_album 表。用户可以是active 或inactive。
表users_album有一列users_id,所以我知道哪个相册图片属于哪个用户。
现在我需要统计所有属于活跃用户的相册图片
我可以。选择所有活跃的用户并将他们的 id 放入一个数组中,然后使用 ->whereIn 过滤:
$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();
编辑:
users 和 users_album 两个表都存储在同一个 DB 中并且具有关系。
我之所以提到第二个数据库,是因为我没有为此使用雄辩的 laravel 风格,f.e.我做不到:UserAlbum::where('isApprove', 'Pending')->count();
编辑
我找到了一个“hacky”解决方案来做到这一点,但很难相信它必须这样做:
$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();
第一步:我从相册图片中提取所有 user_id。
第二步:我只选择用户,其中 id 在先前提取的 id 的数组中,另外我按活动列过滤并再次提取 id。
第三步:现在我可以计算活跃用户的专辑图片,方法是使用之前提取的活跃用户数组额外过滤计数查询。
【问题讨论】:
-
你的问题是什么?如果所有内容都存储在第一个数据库中,你会怎么做?使用适当的索引怎么样?
-
@Nico Haase 东西存储在同一个数据库中
-
@Nico Haase 问题是:我需要统计所有属于活跃用户的相册图片