mongodb / laravel-mongodb

A MongoDB based Eloquent model and Query builder for Laravel (Moloquent)
https://www.mongodb.com/docs/drivers/php/laravel-mongodb/
MIT License
7.02k stars 1.43k forks source link

Make relationship methods public [Feature Request] #2555

Open salaback opened 1 year ago

salaback commented 1 year ago

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);
    });
}
GromNaN commented 1 year ago

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 commented 1 year ago

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

divine commented 1 year ago

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

GromNaN commented 1 year ago

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 commented 12 months ago

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