Skip to content

Raw query breaks with Laravel 5.7.14+ #195

Closed
@drbyte

Description

@drbyte

Describe the bug
ErrorException: Undefined index: operator appears when it tries to parse select queries,
presumably because of the new types added in 5.7.14 (InRaw, NotInRaw, IntegerInRaw, IntegerNotInRaw) in the name of improving eager-loading performance.
Ref: laravel/framework@v5.7.13...v5.7.14
Related Laravel PRs from changelog: (#26434, #26453, 3992140, #26471, a3738cf, #26531)

Eloquent Query

        return WeekendAssignments::select('weekend_assignments.*', 'weekend_roles.RoleName', 'weekend_roles.sortorder')
            ->join('weekend_roles', 'weekend_assignments.roleID', '=', 'weekend_roles.id')
            ->where('weekendID', $this->id)
            ->where('confirmed', true)
            ->withoutGlobalScope('visibleWeekendsOnly')
            ->orderBy('weekend_roles.sortorder', 'asc')
            ->orderBy('weekend_roles.id', 'asc')
            ->get();

which generates:

select "weekend_assignments".*, "weekend_roles"."RoleName", "weekend_roles"."sortorder" 
from "weekend_assignments" 
   inner join "weekend_roles" on "weekend_assignments"."roleID" = "weekend_roles"."id" 
where "weekendID" = ? and "confirmed" = ? 
order by "weekend_roles"."sortorder" asc, "weekend_roles"."id" asc

where WeekendAssignments is a basic Eloquent model with the following:

class WeekendAssignments extends Model
{
    protected $with = 'role';

    public function getRouteKeyName()
    {
        return 'weekendID';
    }
    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope('visibleWeekendsOnly', function (Builder $builder) {
            $builder->whereIn(
                'weekendID',
                Weekend::where('visibility_flag', '>=', WeekendVisibleTo::Community)->get()->pluck('id')
            );
        });
    }

    //
    public function role()
    {
        return $this->belongsTo(WeekendRoles::class, 'roleID');
    }
    //
}

and WeekendRoles (note: "Roles" here refers to "a position held on a team, such as 'food server'" and not related to app permissions):

class WeekendRoles extends Model
{
    use GeneaLabs\LaravelModelCaching\Traits\Cachable;

    protected $with = 'section';

    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope('rolesBySortOrder', function (Builder $query) {
            $query->orderBy('sortorder', 'asc');
        });
    }

    //

    public function section()
    {
        // Section is a simple basic Eloquent model
        return $this->belongsTo(Section::class, 'section_id');
    }
}

Stack Trace
/SITE/vendor/genealabs/laravel-model-caching/src/CacheKey.php:102
/SITE/vendor/genealabs/laravel-model-caching/src/CacheKey.php:262
/SITE/vendor/genealabs/laravel-model-caching/src/CacheKey.php:167
/SITE/vendor/laravel/framework/src/Illuminate/Support/Collection.php:1388
/SITE/vendor/genealabs/laravel-model-caching/src/CacheKey.php:170
/SITE/vendor/genealabs/laravel-model-caching/src/CacheKey.php:36
/SITE/vendor/genealabs/laravel-model-caching/src/Traits/Caching.php:76
/SITE/vendor/genealabs/laravel-model-caching/src/CachedBuilder.php:86
/SITE/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php:155
/SITE/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php:144
/SITE/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:564
/SITE/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:533
/SITE/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:501
/SITE/app/Weekend.php:405
/SITE/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php:444
/SITE/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php:344
/SITE/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php:317
/SITE/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:1513
/SITE/app/Weekend.php:416
/SITE/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php:444
/SITE/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php:344
/SITE/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php:317
/SITE/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:1513
/SITE/app/Http/Controllers/WeekendController.php:94
/SITE/vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
/SITE/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:45
/SITE/vendor/laravel/framework/src/Illuminate/Routing/Route.php:212
... (usual bootstrap stuff)
/SITE/tests/Feature/WeekendStatusTest.php:135

Environment

  • PHP: 7.2.12
  • Laravel: 5.7.14+
  • Model Caching: 0.3.3

Additional context
In feature tests, had to add withoutExceptionHandling() to see the Exceptions being thrown.

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions