【问题标题】:Laravel Join query Not work properlyLaravel Join 查询不能正常工作
【发布时间】:2015-09-29 20:10:40
【问题描述】:

我正在尝试使用连接查询获取用户列表,但它无法正常工作。我想检索除当前 user_id 之外的所有用户。我传入一个 user_id 来排除,但结果返回所有用户,并且它应该有一个除当前 user_id 之外的所有用户的列表。

它还从首选项表而不是用户表返回一个行 id 值。

这是我的问题。

$query = DB::table('users')
           ->join('preferences', function($join) use($results) {
              $join->on('users.id', '=', 'preferences.UserId') 
                ->where('preferences.ClassIdFrom', '>=', $results->ClassIdFrom)
                ->where('preferences.ClassIdTo', '<=', $results->ClassIdTo);
         })
           ->where('users.id', '!=',$UserId)
           ->whereNotIn('users.id', $mid_query)
           ->whereNotIn('users.id', $last_query);

$result = $query->get();

如果我使用 22 的 user_id 运行查询,结果不应该包括这个用户,所以这不起作用。

->where('users.id', '!=',$UserId)

同样,结果会正确返回用户表中的所有列,除了 id 列值来自首选项表。

我想加入后

                    ->where('users.id', '!=',$UserId)
                    ->whereNotIn('users.id', $mid_query)
                    ->whereNotIn('users.id', $last_query);

这三个都不行

【问题讨论】:

    标签: php mysql laravel laravel-4 laravel-5


    【解决方案1】:

    如果您不指定要选择的字段,您将执行select *。执行此操作时,如果多个表具有相同的字段名称(例如id),则检索到的最终值将来自具有该字段的最后一个表。在这种情况下,preferences 表位于 users 表之后,因此两个表中具有相同名称的任何字段都将以 preferences 表中的数据结束。

    快速解决方法是指定您的选择语句:

    $query = DB::table('users')
        ->join('preferences', function($join) use($results) {
            $join->on('users.id', '=', 'preferences.UserId') 
                ->where('preferences.ClassIdFrom', '>=', $results->ClassIdFrom)
                ->where('preferences.ClassIdTo', '<=', $results->ClassIdTo);
        })
        ->where('users.id', '!=',$UserId)
        ->whereNotIn('users.id', $mid_query)
        ->whereNotIn('users.id', $last_query)
        ->select('users.*');
    

    额外

    如果您要设置 Eloquent 模型和关系,也可以使用 Eloquent ORM 执行此查询。

    $users = User::whereHas('preferences', function($query) use ($results) {
        $query->where('ClassIdFrom', '>=', $results->ClassIdFrom)
            ->where('ClassIdTo', '<=', $results->ClassIdTo);
    })
        ->where('id', '!=',$UserId)
        ->whereNotIn('id', $mid_query)
        ->whereNotIn('id', $last_query)
        ->get();
    

    此外,您可以稍微清理一下您的位置:

    $ids = array_merge(array($UserId), $mid_query, $last_query);
    $users = User::whereHas('preferences', function($query) use ($results) {
        $query->where('ClassIdFrom', '>=', $results->ClassIdFrom)
            ->where('ClassIdTo', '<=', $results->ClassIdTo);
    })
        ->whereNotIn('id', $ids)
        ->get();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 2017-08-09
      相关资源
      最近更新 更多