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(来自请求),而不是直接从国籍模型查询这些国籍。我希望你明白我的意思,我没有把你弄糊涂@阿卜杜勒·哈基姆