Search code examples
phplaravelprimary-keyuuidlaravel-medialibrary

spatie/laravel-medialibrary change primary key


I'm using the package spatie/laravel-medialibrary and I want to change the primaryKey on their modal called Media, without editing the package src file.

In my project, I'm using uuids as primary keys for all my models, so naturally, I want to do the same thing for the Media.php model offered by this package.

I already changed the migration to reflect that, by removing the line $table->bigInteger('id') and changing the line $table->uuid('uuid')->nullable(); to table->uuid('uuid')->unique()->primary();

However, now I also want to let the model know I'm using a different key, by setting up protected $primaryKey = 'uuid'; and protected $keyType = 'string'; but I can't find a way to do this outside the packages src file for the Media.php model

Basically, what I want to end up doing is just implementing the HasMedia interface and using the InteractsWithMedia trait on my Profile model, like this:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;

class Profile extends Model implements HasMedia
{
    use InteractsWithMedia;
}

Any suggestions on how to achieve this?

Thanks.


Solution

  • Spatie's medialibrary package gives you the option to use your own media model, as described in their docs.

    Just create your custom model and extend the library's Media model. You can then modify that csutom model to fit your needs.

    use Spatie\MediaLibrary\MediaCollections\Models\Media as BaseMedia;
    
    class Media extends BaseMedia
    {
        protected $primaryKey = 'uuid';
    
        protected $keyType = 'string';
    
        public $incrementing = false;
    
        // ...
    }
    

    Remember to set the media_model key in config/media-library.php to your model's FQCN.

    'media_model' => App\YourMediaModel::class,