Php 如何使用Elount in Laravel从基于多对多关系的表中检索记录?
我有三种模式:国籍、国籍、机会、机会 各表:Php 如何使用Elount in Laravel从基于多对多关系的表中检索记录?,php,laravel,Php,Laravel,我有三种模式:国籍、国籍、机会、机会 各表: ------------------------------------------------------------------- nationalities | nationality_opportunities | opportunities -------------------------------------------------------------------- id
-------------------------------------------------------------------
nationalities | nationality_opportunities | opportunities
--------------------------------------------------------------------
id nationality_id id
name opportunity_id name
在机会模型中:
public function nationalities(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
{
return $this->belongsToMany(Nationality::class,'nationality_opportunities','opportunity_id','nationality_id');
}
public function opportunities()
{
return $this->belongsToMany(Opportunity::class,'nationality_opportunities','opportunity_id','nationality_id');
}
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'));
});
}
在国籍模式中:
public function nationalities(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
{
return $this->belongsToMany(Nationality::class,'nationality_opportunities','opportunity_id','nationality_id');
}
public function opportunities()
{
return $this->belongsToMany(Opportunity::class,'nationality_opportunities','opportunity_id','nationality_id');
}
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'));
});
}
-我想做什么
我想根据Opportunity记录所选的国籍来检索这些记录,这些国籍通过请求作为ID数组发送,因此我想在pivot表中检查这些ID,以便获取它们的相关Opportunity记录并在Vue js组件中显示它们
机会模型中的范围筛选器:
public function nationalities(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
{
return $this->belongsToMany(Nationality::class,'nationality_opportunities','opportunity_id','nationality_id');
}
public function opportunities()
{
return $this->belongsToMany(Opportunity::class,'nationality_opportunities','opportunity_id','nationality_id');
}
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'));
});
}
参数:nations=[1,2,3,5]
api控制器中的属性函数:
public function opportunities()
{
$opportunities = Opportunity::withFilters()->get();
return PublicOpportunityResource::collection($opportunities);
}
您只需使用下面的代码获取机会
$nationalities = Nationality::with('opportunities')->whereIn('id', request()->input('nationalities'))->get();
然后,您可以通过迭代$nations
访问opportunities,或者对于第一行,您可以使用$nations->first()->opportunities
,但不确定在回调函数中使用时的原因
根据编辑,您可以对所需结果进行此查询
$nationalities = request()->input('nationalities');
$opportunities = Opportunity::with(['nationalities' => fn($q) => $q->whereIn('nationality_id', $nationalities)])->get();
您的查询是正确的,但您需要更改当天返回的方式,请遵循
$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);
你的回答很好。如果我在laravel balde中工作,这会很容易,但是如果我使用vue js并在vue js组件中显示这些数据,并使用此查询进行数据过滤,会怎么样?很抱歉一开始我没有提到这一点,所以我编辑了我的问题@AshuI尚未使用vue,但对于react,因为我们需要javascript中的变量,我们使用package将这些集合转换为json,并在我们的组件中使用它们。我使用此查询来筛选机会,我正在尝试根据相关的国籍ID筛选商机,我希望在NationalTypeOpportunity相关透视中搜索这些国籍ID(来自请求),而不是直接从国籍模型查询这些国籍。我希望你明白我的意思,我没有把你弄糊涂。这个查询只会为请求中的国籍ID获取机会。对不起,伙计。你说得对。原来我的问题在另一个函数中。我已经更新了问题。你能看到吗?兄弟,我正在使用此查询筛选机会,我正在尝试根据相关的国籍ID筛选机会,我希望在NationalyOpportunity相关透视中搜索这些国籍ID(来自请求),而不是直接从国籍模型查询这些国籍。我希望你明白我的意思,我没有把你弄糊涂@阿卜杜勒·哈基姆