Seven search call sites used the `ilike` operator, which only PostgreSQL understands. On MySQL they raise a syntax error, so post, asset, label, signature and workspace-member search — plus the MCP list-posts tool — were unusable on an engine `config/database.php` has always supported and the docs advertise. Replace them with `whereLike($column, $value)`, which the query grammars translate per driver: PostgresGrammar emits `ilike` and MySqlGrammar emits `like`. The generated SQL on PostgreSQL is therefore unchanged. Verified by running the full suite on both engines: PostgreSQL 16 3888 passed, 0 failed MySQL 8.0.46 one pre-existing failure fixed, none introduced Also adds case-insensitivity assertions to the five affected suites that lacked them, and search coverage for ListPostsTool, which had none. Note for MySQL installs: `like` is case-insensitive by virtue of the column collation, not the operator. Under the default `utf8mb4_unicode_ci` it is also accent-insensitive, so a search for "cafe" matches a stored "café" — PostgreSQL's `ilike` does not. That difference comes from the collation rather than this change. A `_bin` or `_cs` collation would make search case-sensitive on both. Co-authored-by: Paulo Castellano <paulo@castellanos.llc>
35 lines
1.2 KiB
PHP
35 lines
1.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Actions\Media;
|
|
|
|
use App\Models\Media;
|
|
use App\Models\Workspace;
|
|
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Database\Eloquent\Relations\Relation;
|
|
|
|
class ListWorkspaceAssets
|
|
{
|
|
public static function execute(Workspace $workspace, ?string $search = null, ?string $type = null): LengthAwarePaginator
|
|
{
|
|
return self::query($workspace, $search, $type)
|
|
->paginate((int) config('app.pagination.default'));
|
|
}
|
|
|
|
/**
|
|
* @return Builder<Media>
|
|
*/
|
|
public static function query(Workspace $workspace, ?string $search = null, ?string $type = null): Builder
|
|
{
|
|
return Media::query()
|
|
->where('mediable_type', Relation::getMorphAlias(Workspace::class))
|
|
->where('mediable_id', $workspace->id)
|
|
->where('collection', 'assets')
|
|
->when(filled($search), fn (Builder $query) => $query->whereLike('original_filename', '%'.trim($search).'%'))
|
|
->when(filled($type), fn (Builder $query) => $query->where('type', $type))
|
|
->latest()
|
|
->orderByDesc('id');
|
|
}
|
|
}
|