如何在 laravel 中使用 whereHas

how to use whereHas in laravel

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

 $query = Deal::query();

我想使用 wherehas 运算符。 这是我的有效代码。

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

所以我需要更改第一个代码? 如何将第一个代码转换为 wherehas? 第一个代码来自 table deal,第二个代码来自 realtionship called personnel。 第二部分在代码的其他地方工作,我只需要修复第一部分并且不明白在使用中写什么

我尝试了这个,但在最后一个错误}

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

你可以使用一个名为 when( 的方法,这样你就可以拥有更简洁的代码。第一个参数 if 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( 之前清理您的优先级代码,使整个事情更清晰一些。

在 laravel 中查询数据库非常简单,您只需要执行您想要执行的查询,然后您只需将其替换为 laravel helpers.Or 即可如果您不明白要使用哪个函数,请编写原始查询。 使用,DB::raw('write your sql query').

现在大部分时间whereHad用于过滤特定模型的数据。 更喜欢这个 link,[Laravel 查询官方文档][1] 就像你有 1 对 m 的关系这样你就可以从一个部分或多个部分中检索多个对象 object.like我想过滤一个用户的很多评论,那我就这样吧

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

})->get();

$comments = 这里是你想要的模型 retrive::whereHas('relationship name', function (Builder $query) { $query->where('content', 'like', 'title%'); })->get();

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