[英]How to retrieve records from a table based on many to many relationship using eloquent in Laravel?
我有三个模型:国籍,国籍_机会,机会。
表格:
-------------------------------------------------------------------
nationalities | nationality_opportunities | opportunities
--------------------------------------------------------------------
id nationality_id id
name opportunity_id name
机会 Model:
public function nationalities(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
{
return $this->belongsToMany(Nationality::class,'nationality_opportunities','opportunity_id','nationality_id');
}
国籍 Model:
public function opportunities()
{
return $this->belongsToMany(Opportunity::class,'nationality_opportunities','opportunity_id','nationality_id');
}
-我想做什么?
我想根据他们选择的国籍检索机会记录,这些国籍通过请求作为 id 数组发送,所以我想在 pivot 表中检查这些 id 以获取它们的相关机会记录并在 Vue js 中显示它们零件。
Scope 过滤机会 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'));
});
}
参数:国籍= [1,2,3,5]。
api controller 中的属性 function:
public function opportunities()
{
$opportunities = Opportunity::withFilters()->get();
return PublicOpportunityResource::collection($opportunities);
}
您的查询是正确的,但您需要更改当天的返回方式请关注
$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);
您可以使用下面的代码简单地获取机会
$nationalities = Nationality::with('opportunities')->whereIn('id', request()->input('nationalities'))->get();
然后您可以通过迭代$nationalities
来访问机会,或者对于第一行您可以使用$nationalities->first()->opportunities
,不确定为什么在回调 function 中使用。
根据编辑,您可以针对您想要的结果进行此查询
$nationalities = request()->input('nationalities');
$opportunities = Opportunity::with(['nationalities' => fn($q) => $q->whereIn('nationality_id', $nationalities)])->get();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.