Laravel加入查询无法正常工作

时间:2015-07-10 23:01:46

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

我正在尝试获取具有连接查询的用户列表,但它无法正常工作。我想检索除当前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();

如果我使用user_id为22运行查询,结果不应包含此用户,因此这不起作用。

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

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

我认为加入后

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

这两个都不起作用

1 个答案:

答案 0 :(得分:3)

如果您未指定要选择的字段,则会执行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();