【问题标题】:Laravel second DB connection select and filter by foreign key value [closed]Laravel第二个数据库连接按外键值选择和过滤[关闭]
【发布时间】:2019-08-08 12:24:45
【问题描述】:

我有这种情况:

我在我的 laravel 应用程序中使用了第二个数据库。我使用这种方法连接到它并修改/选择数据:

$result = DB::connection('mysql_live')->table('users_album')
->where('isApprove', 'Pending')->count();

我有一个users 表,一个用户可以有许多专辑图片,所以我有一个users_album 表。用户可以是activeinactive

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();

编辑:

usersusers_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 问题是:我需要统计所有属于活跃用户的相册图片

标签: php mysql sql laravel


【解决方案1】:

尝试加入:类似:

$activeUsers = DB::connection('mysql_live')->table('users_album')->join('users','users.id','=','users_album.users_id')
->where('users.active', '!=', 'inactive')->count();

您应该注意您的索引。 users_id 不好 - user_id 是正确的...

编辑:这个例子运行得很好!

【讨论】:

  • 这不起作用。我假设是因为我使用了不使用 eloquent 的辅助连接。关系在数据库中定义,但不在应用程序中。例如,如果我有:->hasMany('AlbumImage');->belongsTo('User');,您的解决方案将有效
  • 没有定义的关系并不重要,因为关系是在连接中特别指出的。这工作得很好 - 只是尝试过没有任何问题!你试过了吗?我不这么认为......如果你这样做了 - 你得到的错误是什么?我用两张图片更新了我的答案,你可以看到它正在工作
  • 我试过了,它的条目太多了。在我的情况下,结果应该是 171。但它计数超过 200k 条目。我会再试一次,让你知道。感谢您的宝贵时间。
  • 好的 - 它应该按预期工作。可能是db的外键有问题?
  • 我现在有时间再看一遍。我太快放弃您的解决方案,因为我有一个很好的解决方法。这不见了:->where('users_album.isApprove', 'Pending')。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 2019-03-13
  • 1970-01-01
  • 2017-08-11
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多