代码之家  ›  专栏  ›  技术社区  ›  Bastian

如何在laravel中使用whereHas

  •  0
  • Bastian  · 技术社区  · 2 年前

    我是拉拉维尔的新手, 我需要为数据库创建一个查询,

     $query = Deal::query();
    

    我想使用where运算符。 这是我的代码。

    else if ($group_by == 'precedence') {
                    if($get_deals_for == 'noprecedence'){
                        $get_deals_for = 0;
                    }
                    $precedenceStatus = $get_deals_for;
                    $query-> where('precedence', '=', $precedenceStatus);
                //    \Log::info('The request precedence: '.$precedenceStatus);
                   
    
                }
    

    我想将此代码也添加到查询中

    if($person) {
                        $query->whereHas('personnel', function ($subQuery) use ($person) {
                            $subQuery->where('id', '=', $person);
                        });
                    }
    

    所以我需要更改第一个代码? 如何将第一个代码转换为where? 第一个代码来自名为deal的表,第二个部分来自名为personnel的realtionship。 第二部分在代码的其他地方工作,我只需要修复第一部分,不知道在使用中应该写什么

    我尝试了这个,最后一个出现错误}

    else if ($group_by == 'precedence') {
                    if($get_deals_for == 'noprecedence'){
                        $get_deals_for = 0;
                    }
                    $precedenceStatus = $get_deals_for;
                    $query-> where('precedence', '=', $precedenceStatus)
                          -> when ($person, function($query) use($person) {
                            $query->whereHas('personnel', function ($query) use ($person) {
                                $query->where('id', '=', $person);
                            });
                        })
                    }
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   miken32 Amit D    2 年前

    有一个方法可以使用,称为when(,这样你就可以有更干净的代码。如果第一个参数为true,那么它将执行你的条件语句。

    https://laravel.com/docs/9.x/queries#conditional-clauses

    $result = $query
        ->where('precedence', '=', $precedenceStatus)
        ->when($person, function ($query) use ($person) {
            $query->whereHas('personnel', fn ($q) => $q->where('id', '=', $person));
        })
        ->get();
    

    您还应该能够在使用when之前清理您的优先级代码(以使整个代码更干净)。

        2
  •  0
  •   VANITA CHAUDHARI    2 年前

    在laravel中查询数据库非常容易,你只需要找到你想要的查询,然后你只需要用laravel助手替换它。或者,如果你不知道该使用哪个函数,你可以编写原始查询。 使用, DB::raw('write your sql query')

    现在,Had的大部分时间都用于过滤特定模型的数据。 更喜欢这个链接,[Laravel官方查询文档][1]就像你有1到m的关系,这样你就可以从一个部分或多个对象中检索多个对象。就像我想过滤用户的许多评论一样,我会这样做的。

    $comments = Comment::whereHas('user', function (Builder $query) {
    $query->where('content', 'like', 'title%');
    

    })->get();

    $comments=这将是您想要检索的模型::whereHas('关系名称',函数(Builder$query){ $query->其中('content','like','title%'); })->get();

    你也可以在where里面写where。 [1] : https://laravel.com/docs/9.x/eloquent-relationships#querying-relationship-existence