baril/sqlout
A Laravel debugging package that captures and outputs the SQL queries your application executes, making it easy to inspect database activity, trace query flow, and troubleshoot issues during development.
baril/sqlout remains a Laravel Scout driver that moves full-text search onto MySQL FULLTEXT indexes. It fits Laravel monoliths or API services standardized on MySQL that need basic keyword search without operating Algolia, Meilisearch, Typesense, or Elasticsearch. It preserves Scout’s model-level search API, which is architecturally attractive: lower infrastructure footprint, fewer credentials, and one fewer data store to secure and monitor. v5.2.0 meaningfully improves fit for multi-model search surfaces: support for indexing models in different tables removes a prior constraint that pushed teams toward one index table or an external engine once a second searchable model appeared. It is still not a fit for advanced requirements such as typo tolerance, faceting, fuzzy matching, custom ranking, synonyms, or very high query throughput, and it still couples search load and index maintenance to the primary database, so read/write topology and replica routing must be explicit.FULLTEXT indexes. v5.2.0 reduces two practical integration frictions. First, stopwords can now be loaded from a TXT or PHP file, so language/domain-specific stopword behavior becomes configurable and reviewable in version control rather than opaque database defaults — this directly addresses a top migration risk we previously flagged. Second, query(), whereIn(), and whereNotIn() on the base Scout builder are now honored, which matters for multi-tenancy, scoped searches, and pre-filtered result sets; before this, constrained searches could silently ignore constraints, a correctness and data-isolation risk. The main integration risk is unchanged: database DDL and query semantics. Index creation on large tables can lock or consume I/O, and MySQL full-text behavior depends on minimum token length, stopwords, natural-language vs. boolean mode, and language settings. Adding per-table indexing increases the number of indexes to create, backfill, and roll back, so migration planning effort scales with the number of searchable models.scope() is deprecated in favor of Scout’s query(). That is not a hard break, but it creates a fork in the road: code written against scope() will drift from the supported API, and a future major version will likely remove it. Treat the deprecation as a scheduled migration item, not a footnote. MySQL-specific behavior creates portability risk, and Scout upgrades may break driver contracts — the fact that several base builder methods were previously ignored is evidence that driver/Scout parity is incomplete and must be tested per upgrade rather than assumed. Search quality will be materially lower than dedicated engines, though configurable stopwords now give teams a lever to tune relevance without patching vendor code. Treat this as a tactical component, not a strategic search platform.whereIn()/whereNotIn() change result semantics or performance versus prior versions, and are there query shapes that still get silently dropped? What is the removal timeline for scope(), and is there an automated upgrade path? How are migrations, index creation, and rollback handled on large tables and for multiple searchable models? What search modes are exposed, how is ranking controlled, and how are user inputs sanitized? Does it support soft deletes, multi-tenancy, model scopes, pagination, and eager loading? What are the performance characteristics under expected corpus size and query volume? Is there CI, documentation, and a credible maintainer path or fork plan?FULLTEXT indexes through migrations, and compare result quality, latency, and database load against the current approach. If replacing Scout’s database driver, validate that behavior improves beyond LIKE queries; if replacing an external engine, explicitly document the feature regression users will accept. For existing adopters, scope the upgrade as three discrete changes rather than one: (1) migrate scope() call sites to query(), (2) audit all pre-filtered searches to confirm whereIn()/whereNotIn() now actually apply and that results did not previously leak across tenants, and (3) decide whether multi-table indexing or file-based stopwords unlock deferred use cases. The second item deserves priority — a method that was previously ignored becoming enforced can change results in production.query()-based code must be reverted.whereIn()/whereNotIn() behavior → convert scope() to query() → verify per-table index migrations on a production-sized copy → only then extend to additional searchable models or custom stopword files.scope() deprecation as dated technical debt with an owner and a target removal date. Document the driver configuration and index definitions as operational assets.FULLTEXT indexes, misconfigured or unvalidated stopword files, stopword/minimum-token surprises, unsupported search syntax, slow DDL on large tables (multiplied across per-model indexes), Scout upgrade incompatibility, incomplete Scout builder parity causing silently ignored constraints, use of deprecated scope() after removal, MySQL version drift, and database saturation during search spikes. Query construction must be reviewed for injection and malformed boolean expressions. Monitor slow queries, error rates, and database CPU alongside search result quality, and add a specific check for filter predicates being applied rather than dropped.How can I help you explore Laravel packages today?