首页 > 解决方案 > Laravel (v6.x) addSelect() 总是为子查询字段返回一个空值

问题描述

我有这个雄辩的查询:

$users = User::query()
            ->addSelect([
                'latest_login' => Login::select('login_time')
                ->where('logins.user_id', 'users.id')
                ->latest('login_time')
                ->take(1)
            ])
            ->orderBy('latest_login', 'DESC')
            ->get();

问题是“latest_login”字段始终为空。

但是,如果我在 mysql 中运行查询,则该字段已完全填充:

'SELECT `users`.*, (SELECT `login_time` FROM `logins` WHERE `user_id` = users.id AND `login_time` IS NOT NULL ORDER BY `login_time` DESC LIMIT 1) AS `last_login` FROM `users` WHERE `logged_in` > 0 ORDER BY `last_login` DESC

我还尝试使用 DB::select() 在 Laravel 中运行原始查询,并且该字段也返回 null。

请问有什么想法吗?

标签: mysqllaraveleloquentlaravel-6

解决方案


我在这里可能错了,但我认为您必须使用whereColumn而不是where 实际使用列的值,而不仅仅是带有列名的字符串。

$users = User::query()
    ->addSelect([
        'latest_login' => Login::select('login_time')
            ->whereColumn('logins.user_id', 'users.id')
            ->latest('login_time')
            ->take(1)
    ])
    ->orderBy('latest_login', 'DESC')
    ->get();

推荐阅读