staudenmeir / laravel-merged-relations

Merged Laravel Eloquent relationships
MIT License
175 stars 11 forks source link

Enforce morph map not applied #9

Closed codedge closed 2 years ago

codedge commented 2 years ago

Hey,

I am using this package with enforcing a morph map like this

Relation::enforceMorphMap([
            'dropbox' => Dropbox::class,
            'ftp' => Ftp::class,
            's3' => S3::class,
            'user' => User::class,
        ]);

In the created view I see the column laravel_model with the full path/namespace.

Shouldn't this be decoupled when using a morph map?

staudenmeir commented 2 years ago

How are you using the package? What relationships are you combining with createMergeView()? What does the created view look like?

codedge commented 2 years ago

Migration

Schema::createOrReplaceMergeViewWithoutDuplicates(
            'all_export_targets',
            [
                (new Team())->ftpExportTargets(),
                (new Team())->dropboxExportTargets(),
                (new Team())->s3ExportTargets(),
            ]
        );

Enforcing a morph map in den AppServiceProvider boot method.

View is properly created, but with full class namespace.

grafik

View structure

 SELECT export_target_ftp.id,
    export_target_ftp.name,
    export_target_ftp.host,
    export_target_ftp.port,
    export_target_ftp.username,
    export_target_ftp.password,
    export_target_ftp.root,
    export_target_ftp.passive,
    export_target_ftp.ssl,
    export_target_ftp.created_at,
    export_target_ftp.updated_at,
    NULL::character varying AS access_token,
    NULL::text AS access_key,
    NULL::text AS access_secret,
    exportables.team_id AS laravel_foreign_key,
    'App\Models\ExportTarget\Ftp'::text AS laravel_model,
    'access_token,access_key,access_secret'::text AS laravel_placeholders,
    ''::text AS laravel_with
   FROM export_target_ftp
     JOIN exportables ON export_target_ftp.id = exportables.exportable_id
  WHERE exportables.exportable_type::text = 'ftp'::text
UNION
 SELECT export_target_dropbox.id,
    export_target_dropbox.name,
    NULL::text AS host,
    NULL::smallint AS port,
    NULL::text AS username,
    NULL::text AS password,
    NULL::character varying AS root,
    NULL::boolean AS passive,
    NULL::boolean AS ssl,
    export_target_dropbox.created_at,
    export_target_dropbox.updated_at,
    export_target_dropbox.access_token,
    NULL::text AS access_key,
    NULL::text AS access_secret,
    exportables.team_id AS laravel_foreign_key,
    'App\Models\ExportTarget\Dropbox'::text AS laravel_model,
    'host,port,username,password,root,passive,ssl,access_key,access_secret'::text AS laravel_placeholders,
    ''::text AS laravel_with
   FROM export_target_dropbox
     JOIN exportables ON export_target_dropbox.id = exportables.exportable_id
  WHERE exportables.exportable_type::text = 'dropbox'::text
UNION
 SELECT export_target_s3.id,
    export_target_s3.name,
    NULL::text AS host,
    NULL::smallint AS port,
    NULL::text AS username,
    NULL::text AS password,
    NULL::character varying AS root,
    NULL::boolean AS passive,
    NULL::boolean AS ssl,
    export_target_s3.created_at,
    export_target_s3.updated_at,
    NULL::character varying AS access_token,
    export_target_s3.access_key,
    export_target_s3.access_secret,
    exportables.team_id AS laravel_foreign_key,
    'App\Models\ExportTarget\S3'::text AS laravel_model,
    'host,port,username,password,root,passive,ssl,access_token'::text AS laravel_placeholders,
    ''::text AS laravel_with
   FROM export_target_s3
     JOIN exportables ON export_target_s3.id = exportables.exportable_id
  WHERE exportables.exportable_type::text = 's3'::text;
staudenmeir commented 2 years ago

Please share the ftpExportTargets, dropboxExportTargets and s3ExportTargets relationships.

codedge commented 2 years ago
public function ftpExportTargets(): MorphToMany
{
    return $this->morphedByMany(Ftp::class, 'exportable');
}

public function dropboxExportTargets(): MorphToMany
{
    return $this->morphedByMany(Dropbox::class, 'exportable');
}

public function s3ExportTargets(): MorphToMany
{
    return $this->morphedByMany(S3::class, 'exportable');
}

public function exportTargets(): MergedRelation
{
    return $this->mergedRelation('all_export_targets');
}
staudenmeir commented 2 years ago

Thanks. Yeah, I think it makes sense to use the morph map here. I released a new version (for Laravel 9).