Skip to content

Make relationship methods public [Feature Request]  #2555

Open
@salaback

Description

@salaback

Is your feature request related to a problem?

When trying to insert relationships into models via a service provider, it is not possible because the mongo specific methods are protected. Laravel has these methods public for this reason.

Describe the solution you'd like

Swap out protected for public methods

Describe alternatives you've considered

Other than forking the package I don't see a work around.
I could create a public method on the target model which then returns the protected on, however this feels rather hacky and creates requirements on a third party package.

Additional context

Inserting a relationship via the service provider is not the most well documented features, but it is usefully for being able to decouple packages and works as follows:

public function boot(): void
{
    Parent::resolveRelationUsing('children', function ($parent) {
        return $parent->hasMany(Child::class);
    });
}

Activity

GromNaN

GromNaN commented on Jul 8, 2023

@GromNaN
Member

What protected methods do you need to make public? EmbedsRelations has 2 protected methods: embedsMany and embedsOne. The methods in HybridRelations are public already.

salaback

salaback commented on Jul 8, 2023

@salaback
Author

Sorry that wasn't clear, yes it is embedsMany and embedsOne that I need public.

divine

divine commented on Jul 8, 2023

@divine
Contributor

Embedded relation needs a complete rewrite after that it'll be made public possibly until that it won't be touched.

GromNaN

GromNaN commented on Aug 30, 2023

@GromNaN
Member

I opened #2588 to make this methods public.
For my culture, do you have any documentation on how to "insert relationships into models via a service provider" ?

alaminfirdows

alaminfirdows commented on Nov 13, 2023

@alaminfirdows

I opened #2588 to make this methods public. For my culture, do you have any documentation on how to "insert relationships into models via a service provider" ?

Are you looking for this?

use App\Models\Order;
use App\Models\Customer;
 
Order::resolveRelationUsing('customer', function (Order $orderModel) {
    return $orderModel->belongsTo(Customer::class, 'customer_id');
});

Ref: https://laravel.com/docs/10.x/eloquent-relationships#dynamic-relationships

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    relationsRelations between documents

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Participants

      @GromNaN@salaback@alaminfirdows@divine

      Issue actions

        Make relationship methods public [Feature Request] · Issue #2555 · mongodb/laravel-mongodb