Astrotomic / laravel-translatable

A Laravel package for multilingual models
https://docs.astrotomic.info/laravel-translatable/
MIT License
1.24k stars 156 forks source link

Translations broken on postgresql if using UUIDs #360

Open pixelplant opened 1 year ago

pixelplant commented 1 year ago

Describe the bug After the upgrade to 11.12 (since we need Laravel 10 support) our translations are broken. The main table using translations has an UUID key used for the getTranslationRelationKey(), so imagine having a table called "properties" with an "uuid" primary key and the translations are stored in property_translations.

To Reproduce Make sure you're using a postgresql DB Use any eloquent model that has an uuid primary key, let's say it's called Property. Call the translations method on it:

$p = App\Models\Property::first()
$p->translation

and see the following error:

SQLSTATE[42883]: Undefined function: 7 ERROR:  function max(uuid) does not exist
LINE 1: ...\" from \"property_translations\" inner join (select max(\"prope...

Expected behavior Translations should work as before

Screenshots If applicable, add screenshots to help explain your problem.

Versions (please complete the following information)

Additional context It's linked to the "translation" call in the Relationship.php trait New code with error calls 'max' on the ofMany relationship

    public function translation(): HasOne
    {
        return $this
            ->hasOne($this->getTranslationModelName(), $this->getTranslationRelationKey())
            ->ofMany([
                $this->getTranslationRelationKey() => 'max',
            ], function (Builder $query): void {
                $query->where($this->getLocaleKey(), $this->localeOrFallback());
            });
    }

Old code which worked did not call max and worked fine

    public function translation(): HasOne
    {
        return $this
            ->hasOne($this->getTranslationModelName(), $this->getTranslationRelationKey())
            ->where($this->getLocaleKey(), $this->localeOrFallback());
    }

Exception

function max(uuid) does not exist
LINE 1: ...\" from \"property_translations\" inner join (select max(\"prope...

Stack Trace The full stack trace of the thrown exception.

pixelplant commented 1 year ago

see the notes regarding the MAX aggregate and UUIDs on PostgreSQL => https://laravel.com/docs/10.x/eloquent-relationships#has-one-of-many

Gummibeer commented 1 year ago

Not a bug with the package - as you noted it's based on the max call which isn't supported on PostgreSQL UUIDs. So don't use UUIDs or don't use the translation relationship.