【问题标题】:How to retrieve records from a table based on many to many relationship using eloquent in Laravel?如何在 Laravel 中使用 eloquent 基于多对多关系从表中检索记录?
【发布时间】:2020-12-27 01:25:41
【问题描述】:

我有三个模型:国籍、国籍_机会、机会。

表格:

-------------------------------------------------------------------
   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');

    }

-我想做什么?

我想根据他们选择的国籍检索机会记录,这些记录通过请求作为 id 数组发送,所以我想在数据透视表中检查这些 id 以获取它们的相关机会记录并将它们显示在一个 Vue js 组件。

机会模型中的范围过滤器:

    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'));

        });
    }

参数:nationalities = [1,2,3,5]。

api 控制器中的属性函数:

 public function opportunities()
    {
        $opportunities = Opportunity::withFilters()->get();

        return PublicOpportunityResource::collection($opportunities);
    }

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    您的查询是正确的,但您需要更改当天的返回方式请关注

    $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);
    

    【讨论】:

    • 兄弟我正在使用此查询来过滤机会,我正在尝试根据其相关的国籍 ID 过滤机会,我想在 NationaltyOpportunity 相关中搜索那些国籍 ID(来自请求)枢轴不直接从国籍模型中查询这些国籍。我希望你明白我的想法,我没有混淆你。 @Abdul Hakeem
    【解决方案2】:

    您可以使用下面的代码简单地获取机会

    $nationalities = Nationality::with('opportunities')->whereIn('id', request()->input('nationalities'))->get(); 
    

    然后您可以通过迭代$nationalities 来访问机会,或者对于第一行您可以使用$nationalities->first()->opportunities,但不确定您为什么在回调函数中使用when。

    根据编辑,您可以针对您想要的结果进行此查询

    $nationalities = request()->input('nationalities');
    
    $opportunities = Opportunity::with(['nationalities' => fn($q) => $q->whereIn('nationality_id', $nationalities)])->get(); 
    

    【讨论】:

    • 您的回答很棒。如果我在 laravel balde 工作会很容易,但是如果我使用 vue js 并在 vue js 组件中显示这些数据并使用此查询进行数据过滤怎么办?对不起。我一开始没有提到,所以我编辑了我的问题。 @阿舒
    • 我还没有使用过 vue,但是为了做出反应,因为我们需要 javascript 中的变量,我们使用 github.com/laracasts/PHP-Vars-To-Js-Transformer 包将这些集合转换为 json 并在我们的组件中使用它们
    • 兄弟我正在使用此查询来过滤机会,我正在尝试根据其相关国籍 ID 过滤机会,我想在 NationaltyOpportunity 相关中搜索那些国籍 ID(来自请求)枢轴不直接从国籍模型中查询这些国籍。我希望你明白我的想法,我没有让你感到困惑。
    • 查询将仅获取请求中的国籍 ID 的机会
    • 对不起,伙计。你是对的。原来我的问题出在另一个函数上。我已经更新了这个问题。可以看看吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多