Php 其中,每个数组项上都有where子句

Php 其中,每个数组项上都有where子句,php,arrays,laravel,where-in,Php,Arrays,Laravel,Where In,假设我有一个用户对象(属于多个组),我正在使用一组受人尊敬的ID执行一个任务,如下所示: whereIn('user_id', $group->users->modelKeys()) 但是,我需要设置一个条件,根据组用户透视表“created_at”(基本上是该用户添加到组的时间戳)的条件,仅从每个数组项中提取数据 所以我需要这样的东西: whereIn('user_id', $group->users->modelKeys())->whereRaw('visit

假设我有一个用户对象(属于多个组),我正在使用一组受人尊敬的ID执行一个任务,如下所示:

whereIn('user_id', $group->users->modelKeys())
但是,我需要设置一个条件,根据组用户透视表“created_at”(基本上是该用户添加到组的时间戳)的条件,仅从每个数组项中提取数据

所以我需要这样的东西:

whereIn('user_id', $group->users->modelKeys())->whereRaw('visits.created_at > group_user.created_at')
但这不起作用,因为它不是对每个数组项执行whereRaw,而是对整个查询执行一次whereRaw。我可能需要做一些类似嵌套的操作,但也不确定这是否能解决问题。想法

我现在的完整查询:

     $ids = $group->users->modelKeys();

     return DB::table('visits')->whereIn('user_id', function($query) use ($ids) {
        $query->select('user_id')->from('group_user')->whereIn('group_user.user_id', $ids)->whereRaw('visits.created_at > group_user.created_at');
    })->sum("views");
“确定”使用嵌套循环使其工作:

    $visits = DB::table('visits')->whereIn('user_id', $group->users->modelKeys())->get();

    $sum = 0;

    foreach($group->users as $user) {

        foreach($visits as $visit) {

            if($visit->user_id == $user->id) {

                if($visit->created_at >= $user->pivot->created_at) {
                    $sum += $visit->views;
                }
            }
        }

    }

    return $sum;

仍然希望查看是否可以在单个查询中执行此操作,而不使用数组循环。

您是否考虑过使用
foreach

$users = whereIn('user_id', $group->users->modelKeys());

foreach ($users as $user) {
  // do your comparison here
}

您是否考虑过使用
foreach

$users = whereIn('user_id', $group->users->modelKeys());

foreach ($users as $user) {
  // do your comparison here
}

我想您需要使用联接进行此查询,以下代码可能会引导您走向正确的方向:

$ids = $group->users->modelKeys();

return DB::table('visits')->join('group_user', function ($query) use ($ids) {
    $query->on('visits.user_id', '=', 'group_user.user_id')
        ->whereIn('group_user.user_id', $ids)
        ->whereRaw('visits.created_at > group_user.created_at');
})->sum("views");
编辑

$ids = $group->users->modelKeys();

return DB::table('visits')->join('group_user', function ($query) use ($ids) {
    $query->on('visits.user_id', '=', 'group_user.user_id');
})->whereIn('group_user.user_id', $ids)
   ->whereRaw('visits.created_at > group_user.created_at')->sum("views");
编辑

$ids = $group->users->modelKeys();

return DB::table('visits')->join('group_user', function ($query) use ($ids) {
    $query->on('visits.user_id', '=', 'group_user.user_id');
})->whereIn('group_user.user_id', $ids)
   ->whereRaw('visits.created_at > group_user.created_at')->sum("views");
$ids=$group->users->modelKeys()


我想您需要使用联接进行此查询,以下代码可能会引导您走向正确的方向:

$ids = $group->users->modelKeys();

return DB::table('visits')->join('group_user', function ($query) use ($ids) {
    $query->on('visits.user_id', '=', 'group_user.user_id')
        ->whereIn('group_user.user_id', $ids)
        ->whereRaw('visits.created_at > group_user.created_at');
})->sum("views");
编辑

$ids = $group->users->modelKeys();

return DB::table('visits')->join('group_user', function ($query) use ($ids) {
    $query->on('visits.user_id', '=', 'group_user.user_id');
})->whereIn('group_user.user_id', $ids)
   ->whereRaw('visits.created_at > group_user.created_at')->sum("views");
编辑

$ids = $group->users->modelKeys();

return DB::table('visits')->join('group_user', function ($query) use ($ids) {
    $query->on('visits.user_id', '=', 'group_user.user_id');
})->whereIn('group_user.user_id', $ids)
   ->whereRaw('visits.created_at > group_user.created_at')->sum("views");
$ids=$group->users->modelKeys()


解决了!foreach循环方法使调用花费的时间太长。有些查询返回了超过10万条记录(循环次数很多),导致服务器挂起。答案在一定程度上是达尔梅什·帕特尔第三次编辑方法的巨大帮助。我唯一需要做的不同的事情就是为group_id添加一个where子句

这是最后一个查询(以毫秒为单位返回100k结果查询)


解决了!foreach循环方法使调用花费的时间太长。有些查询返回了超过10万条记录(循环次数很多),导致服务器挂起。答案在一定程度上是达尔梅什·帕特尔第三次编辑方法的巨大帮助。我唯一需要做的不同的事情就是为group_id添加一个where子句

这是最后一个查询(以毫秒为单位返回100k结果查询)



我希望避免这种情况,因为它可能会导致过多的查询。我想你会发现,事实并非如此。比较应该在php中完成。好的,你是对的。如果我使用两个嵌套的If语句执行两个嵌套循环,我就可以填充返回数组。我希望看看是否有一种方法可以只通过一个查询来实现……我希望避免这种情况,因为它可能会导致过多的查询。我想你会发现它不会。比较应该在php中完成。好的,你是对的。如果我使用两个嵌套的If语句执行两个嵌套循环,我就可以填充返回数组。我想看看是否有一种方法可以只通过一个查询来实现……这返回一个错误:Undefined method:JoinClause::Where()谢谢,但这做了一些奇怪的事情。它没有正确返回数据,我认为这是因为它没有在每个ID上执行whereRaw。此外,您的查询不再需要像“use($ids)”这样的连接,因为现在这种情况发生在连接之外。我更新了我的问题,显示了我现在使用的嵌套数组,以使其正常工作。但是如果可能的话,我仍然希望找到一个合适的查询。我测试了这个查询,我认为它应该可以工作,我在查询和循环中看到的区别是,在查询中,您将日期与
进行比较,而在循环中,您使用的是
=
。可能正在更改,在查询中将生成正确的结果。否>=不是原因。日期等于毫秒的可能性非常小。在两种解决方案中仍使用>=我的数组解决方案返回的结果与您的查询不同(且正确)。顺便说一句,我非常感谢您的帮助。注意到您在循环中比较的是
group\u user.id
,而不是
group\u user.id
与查询中一样,尝试新编辑的查询此返回错误:未定义的方法:JoinClause::where(),谢谢,但这做了一些奇怪的事情。它没有正确返回数据,我认为这是因为它没有在每个ID上执行whereRaw。此外,您的查询不再需要像“use($ids)”这样的连接,因为现在这种情况发生在连接之外。我更新了我的问题,显示了我现在使用的嵌套数组,以使其正常工作。但是如果可能的话,我仍然希望找到一个合适的查询。我测试了这个查询,我认为它应该可以工作,我在查询和循环中看到的区别是,在查询中,您将日期与
进行比较,而在循环中,您使用的是
=
。可能正在更改,在查询中将生成正确的结果。否>=不是原因。日期等于毫秒的可能性非常小。在两种解决方案中仍使用>=我的数组解决方案返回的结果与您的查询不同(且正确)。顺便说一句,我非常感谢您的帮助。注意到您正在循环中比较
group\u user.id
,而不是
group\u user.id
,与查询中一样,尝试新编辑的查询,通过不使用急加载来检索用户id(急加载会增加大型查询的开销),使其更加高效。相反,我是这样做的:
$ids=DB::table('group\u user')->where('group\u id',$group->id)->列表('user\u id')用这个更新了我的答案。通过不使用即时加载来检索用户ID(对于大型查询,即时加载会有开销),它变得更加高效。相反,我是这样做的:
$ids=DB::table('group\u user')->where('group\u id',$group->id)->列表('user\u id')用这个更新了我的答案。