Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

basvandertogt's avatar

Eloquent query filter with custom raw select

I wrote this eloquent query which works without an active filter:

User controller:

$users = User::filter(request(['ngf_id', 'first_name', 'last_name', 'tariff']))
            ->select('*', DB::raw('YEAR(CURDATE()) - YEAR(birthdate) - IF(STR_TO_DATE(CONCAT(YEAR(CURDATE()), \'-\', MONTH(birthdate), \'-\', DAY(birthdate)) ,\'%Y-%c-%e\') > CURDATE(), 1, 0) AS age'))
            ->whereNotNull('moneybird_id')
            ->whereDate('member_date', '<', $whereMemberDate)
            ->whereDate('end_date', '!=', $whereEndDate)
            ->where('status', '=', 'active')
            ->orderBy('last_name')
            ->paginate(100);

But when i activate the tariff filter i get "Unknown column 'age' in 'where clause'".

User model:

public function scopeFilter($query, $filters) {
        if (isset($filters['tariff'])) {
            if ($tariff = $filters['tariff']) {
                if ($tariff == 1) {
                    $query->where('age', '>', 18);
                }

                if ($tariff == 2) {
                    $query->whereBetween('age', [0, 14]);
                }

                if ($tariff == 3) {
                    $query->whereBetween('age', [15, 18]);
                }

                if ($tariff == 4) {
                    $query->where('membership', '=', 4);
                }

                if ($tariff == 5) {
                    $query->where('membership', '=', 5);
                }
            }
        }
    }

Any idea?

Regards, Bas

0 likes
1 reply
Cinek's avatar
Cinek
Best Answer
Level 6

You cannot use select alias in your where clause. There's link to mysql explaination but on postgres or oracle DB will not work too. https://dev.mysql.com/doc/refman/5.7/en/problems-with-alias.html

You have to use whole YEAR(CURDATE()) - YEAR(birthdate) - IF(STR_TO_DATE(CONCAT(YEAR(CURDATE()), \'-\', MONTH(birthdate), \'-\', DAY(birthdate)) ,\'%Y-%c-%e\') > CURDATE(), 1, 0)

in your where clause.

1 like

Please or to participate in this conversation.