v1.9.6
Immutable
release. Only release title and notes can be modified.
Fixed
MixedQueryBuilderEloquentAnalyzerno longer flags a read-only class that mixesDB::table()with Eloquent when it explicitly manages global scopes viawithoutGlobalScope()/withoutGlobalScopes()and performs no query-builder writes — a deliberate cross-tenant analytics pattern where the scope bypass is intentional and signalled; query-builder writes (which bypass model events/casts) still flag, and classes that never callwithoutGlobalScope()are unaffected (#262)PhpSideFilteringAnalyzerno longer flagsfilter()/reject()whose predicate reads a JSON/array-cast attribute sub-key (e.g.$q->config['required']) or adata_get()/Arr::get()nested lookup — these have no portable SQL equivalent (JSON path operators differ across SQLite and MySQL) so the predicate cannot be pushed into the query; mirrors the existing authorization-predicate skip, andfilter()/reject()on plain columns still flag (#263)EloquentNPlusOneAnalyzerno longer flags the generate-until-unique idiom (while (Model::where('code', $code)->exists()) { $code = ...; }) as N+1 — anexists()/doesntExist()query in awhile/do-whilecondition whose probed variable is reassigned in the loop body is a bounded uniqueness search, not a per-row query; queries in the loop body, non-existence terminals, and per-item existence checks inside aforeachstill flag (#264)