繁体   English   中英

如何使用 Laravel 中的 eloquent 从基于多对多关系的表中检索记录?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM