Reputation: 730
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
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
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