Laravel 6.x-hasMany,belongsTo,何时对它们执行数据库查询?

时间:2019-12-24 05:40:59

标签: php laravel eloquent

我对我的应用程序的性能有点好奇。因此,我只想知道何时执行hasMany和belongsTo的查询?

以下是相关的示例代码:

class Article extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

class User extends Authenticatable
{

    public function articles()
    {
        return $this->hasMany(Article::class);
    }
}

如果我使用以下方法获取所有用户:

$user = App\User::find(1);

现在,如果我需要该用户的文章,我会这样做:

$user->articles;

这在Laravel的后端中执行以下查询:

SELECT * FROM articles WHERE user_id = 1

,它将为我提供用户的所有文章。到目前为止,一切都很好。但是在大多数情况下,我只需要用户的信息,而不希望Laravel执行该查询来获取用户的文章。同样,我对belongsTo也是如此。

我的问题是,当我为User执行查询时,laravel是否执行对文章的查询?或在我致电时执行查询:

$user->articles;

这只是一个示例方案。我有许多现实世界场景,其中一个模型与许多其他模型有关系。 因此,如果我对所有用户使用以下技术:

$users = App\User::all();

它将对所有用户一一执行文章查询吗?还是一次?在什么时候查询文章?如果我不打电话:

$user->articles;

它是否仍在数据库中查询用户的文章?

更新

因此,经过一番努力,我发现当您查询一个或多个用户时:

$user = App\User::find(1);

在您调用文章之前,它不会为用户获取文章:

$user->articles;

但是现在还有另一个问题。如果我要获取所有用户,并且还需要每个用户的文章,则必须执行以下操作:

$users = App\User::all();

,然后在一个循环中,我将为每个用户获取文章,并对每个用户分别执行文章查询。这仍然是性能问题。如果有100个用户,那么我将不得不使用all()方法查询一次user表,然后再查询100个查询每个用户的文章。这不是我想要的。我需要一个查询用户和一个查询文章。为所有用户带来商品后,应将相关商品分配给每个用户。

但是看来Laravel中没有这样的东西。我将必须获取所有用户的user_ids并进行如下查询:

$articles = \App\Article::whereIn("user_id", $user_ids_array)->get();

然后,我将不得不遍历文章并为每个用户分配他们的文章。 我只是想找到一个使用Laravel的捷径。 但似乎目前尚不可能。我希望这在将来的Laravel版本中可用。

1 个答案:

答案 0 :(得分:1)

您需要阅读有关Laravel中Eager-loading的更多信息。 对于您的情况,您需要执行以下操作:

$users = App\User::with('articles')->get();

“ with”方法正是为此而设计的。

在您的初始查询调用之后获取所有文章的另一种方法是:

$users = App\User::get();
$users->load('articles');

当然,这意味着您在用户模型中具有工作关系并带有“ public function article(){}”。大概是这样的:

public function articles() {
  return $this->hasMany(Article::class);
}

您可以在此处了解有关此功能的更多信息:https://laravel.com/docs/6.x/eloquent-relationships#eager-loading