Php Laravel6.x-hasMany,belongsTo,什么时候执行这些数据库查询?

Php Laravel6.x-hasMany,belongsTo,什么时候执行这些数据库查询?,php,laravel,eloquent,Php,Laravel,Eloquent,我对我的应用程序的性能有点好奇。因此,我只想知道何时执行hasMany和belongsTo的查询 以下是相关的示例代码,例如: class Article extends Model { public function user() { return $this->belongsTo(User::class); } } class User extends Authenticatable { public function article

我对我的应用程序的性能有点好奇。因此,我只想知道何时执行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;
$users = App\User::all();
$articles = \App\Article::whereIn("user_id", $user_ids_array)->get();
这将在Laravel的后端执行以下查询:

SELECT * FROM articles WHERE user_id = 1
它会为用户提供所有的文章。到现在为止,一直都还不错。但在大多数情况下,我只需要用户的信息,不希望Laravel执行该查询来获取用户的文章。我也需要同样的东西

我的问题是,当我为用户执行查询时,laravel是否执行文章查询?或者在我调用时执行查询:

$user->articles;
这只是一个示例场景。我有很多现实场景,其中一个模型与许多其他模型有关系。 因此,如果我向所有用户提供:

$users = App\User::all();
它会一个接一个地为所有用户执行文章查询吗?还是马上?什么时候查询文章?如果我不打电话:

$user->articles;
它仍然在数据库中查询用户的文章吗

更新

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

$user = App\User::find(1);
在您调用文章之前,它不会为用户获取文章:

$user->articles;
但现在还有另一个问题。如果我正在获取所有用户,并且我还需要每个用户的文章,我将必须执行以下操作:

$user->articles;
$users = App\User::all();
$articles = \App\Article::whereIn("user_id", $user_ids_array)->get();
然后在一个循环中,我将为每个用户获取文章,并分别为每个用户执行文章查询。这仍然是一个性能问题。如果有100个用户,那么我必须使用all()方法查询users表一次,然后对每个用户的文章进行100次查询。这不是我想要的。我需要一个用户查询和一个文章查询。一旦为所有用户提供了文章,则应将相关文章分配给每个用户

但在拉雷维尔似乎没有这样的事情。我必须获取所有用户的用户ID,并进行如下查询:

$user->articles;
$users = App\User::all();
$articles = \App\Article::whereIn("user_id", $user_ids_array)->get();
然后,我必须循环浏览这些文章,并为每个用户分配他们的文章。 我只是想找到一条使用拉威尔的捷径。
但现在看来这是不可能的。我希望这能在以后的Laravel版本中提供。

您需要阅读更多关于Laravel中的即时加载的信息。 在您的情况下,您需要执行以下操作:

$users = App\User::with('articles')->get();
“with”方法正是针对这一点的

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

$users = App\User::get();
$users->load('articles');
当然,这意味着您在用户模型中有一个工作关系和“public function articles(){}”。可能是这样的:

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

您可以在此处阅读有关此功能的更多信息:

阅读没有多大帮助的laravel doc@zahidhasanemon。或者这个问题没有在那里解释?或者它在我头上。我找不到一个简单的解释。我只是实现了你的方法。而且它工作得非常好。这就是我想要的。谢谢。我检查了查询日志,发现现在Laravel只对数据库进行了2次查询。一个用于用户,一个用于所有用户的文章。回答中需要稍加修改。我们需要在这种方法中使用get()方法。all()不起作用。