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

abbood's avatar

query builder fails on scope: strtolower() expects parameter 1 to be string, object given

I was able to compile this query builder and run it on tinker like so:

\DB::table('stores')->selectRaw('stores.ref,t.text as ref_ar')->join(\DB::raw("(select item, text from translator_translations where locale ='ar' AND namespace ='*' AND item like 'store.ref%') as t"), function($join) { $join->on(\DB::raw('SUBSTRING(stores.ref_translation FROM 14 FOR 26)'),'=',\DB::raw('t.item')); })->get();

but when I adde the above to a scope like so:

    public function scopeAddTranslation($query)
    {
        $query->addSelect(\DB::raw('translator_translations.text'))
                     ->join(\DB::raw("(select item, text from translator_translations where locale ='ar' AND namespace ='*' AND item like 'store.ref%') as t"),
                     function($join) {
                         $join->on($join->on(\DB::raw('SUBSTRING(stores.ref_translation FROM 14 FOR 26)'),'=',\DB::raw('t.item')));
                     });

        return $query;

    }

it fails with this stack trace:

[2018-02-15 06:29:01] local.ERROR: ErrorException: strtolower() expects parameter 1 to be string, object given in /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Database/Grammar.php:58 Stack trace: 
0 /Users/Shared/dev/php/toters-api/vendor/sentry/sentry/lib/Raven/Breadcrumbs/ErrorHandler.php(34): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(2, 'strtolower() ex...', '/Users/Shared/d...', 58, Array) 
1 [internal function]: Raven_Breadcrumbs_ErrorHandler->handleError(2, 'strtolower() ex...', '/Users/Shared/d...', 58, Array) 
2 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Database/Grammar.php(58): strtolower(Object(Illuminate\Database\Query\JoinClause)) 
3 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php(252): Illuminate\Database\Grammar->wrap(Object(Illuminate\Database\Query\JoinClause)) 
4 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php(180): Illuminate\Database\Query\Grammars\Grammar->whereColumn(Object(Illuminate\Database\Query\JoinClause), Array) 
5 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php(150): Illuminate\Database\Query\Grammars\Grammar->compileWheres(Object(Illuminate\Database\Query\JoinClause)) 
6 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php(77): Illuminate\Database\Query\Grammars\Grammar->compileJoins(Object(Illuminate\Database\Query\Builder), Array) 
7 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php(53): Illuminate\Database\Query\Grammars\Grammar->compileComponents(Object(Illuminate\Database\Query\Builder)) 
8 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(1581): Illuminate\Database\Query\Grammars\Grammar->compileSelect(Object(Illuminate\Database\Query\Builder)) 
9 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(1648): Illuminate\Database\Query\Builder->toSql() 
0 likes
1 reply
bobbybouwmann's avatar

Your mistake is in here

$join->on($join->on(\DB::raw('SUBSTRING(stores.ref_translation FROM 14 FOR 26)'),'=',\DB::raw('t.item')));

You call $join->on twice. and therefore you get this error message!

Please or to participate in this conversation.