Fateh Alrabeai
Fateh Alrabeai

Reputation: 730

How to retrieve records from a table based on many to many relationship using eloquent in Laravel?

I have Three Models: Nationality, Nationality_Opportunity, Opportunity.

The Tables :

-------------------------------------------------------------------
   nationalities   |  nationality_opportunities   |   opportunities
--------------------------------------------------------------------
        id                    nationality_id             id
        name                  opportunity_id             name   

In Opportunity Model:

 public function nationalities(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
    {
        return $this->belongsToMany(Nationality::class,'nationality_opportunities','opportunity_id','nationality_id');
    }

In Nationality Model:

 public function opportunities()
    {
        return $this->belongsToMany(Opportunity::class,'nationality_opportunities','opportunity_id','nationality_id');

    }

-What do I want to do ?

I want to retrieve the opportunities records based on their selected nationalities which are sent as an array of ids through the request, so I want to check these ids in the pivot table in order to get their related opportunities records and display them in a Vue js component.

Scope Filter in Opportunity Model:

    public function scopeWithFilters($query)
    {
        return $query->when(count(request()->input('categories', [])), function ($query) {

            $query->whereIn('opp_cat_id', request()->input('categories'));

        })->when(count(request()->input('nationalities',[])),function ($query){

            $query->whereIn('nationalities.nationality_id', request()->input('nationalities'));

        });
    }

The parameter: nationalities = [1,2,3,5] .

Properties function in api controller:

 public function opportunities()
    {
        $opportunities = Opportunity::withFilters()->get();

        return PublicOpportunityResource::collection($opportunities);
    }

Upvotes: 0

Views: 91

Answers (2)

Sudhanshu Kumar
Sudhanshu Kumar

Reputation: 2044

You can simply fetch opportunities with the code below

$nationalities = Nationality::with('opportunities')->whereIn('id', request()->input('nationalities'))->get(); 

And then you can access the opportunities by iterating over $nationalities or for the first row you can use $nationalities->first()->opportunities, not sure why you're using when in the callback function.

As per the edit you can make this query for your desired result

$nationalities = request()->input('nationalities');

$opportunities = Opportunity::with(['nationalities' => fn($q) => $q->whereIn('nationality_id', $nationalities)])->get(); 

Upvotes: 0

Abdul Hakeem
Abdul Hakeem

Reputation: 405

Your Query is correct but you need to change the way you return the day please follow

$nationalities = [1,2,3,5]; //for temperory ids you can change it
$data= Nationality::with('opportunities')->whereIn('id', $nationalities)->get();

//return it as below
return response()->json($nationalities);

Upvotes: 1

Related Questions