Laravel - Eloquent "Has"、 "With"、 "WhereHas"- 它们是什么意思?

标签 laravel orm eloquent relational-database relationship

我发现这些方法背后的概念和含义有点令人困惑,是否有人可以向我解释一下 haswith 之间的区别是,在示例的上下文中(如果可能的话)?

最佳答案

with() 用于急切加载。这基本上意味着,沿着主模型,Laravel 将预加载您指定的关系。如果您有一组模型并且想要加载所有模型的关系,这尤其有用。因为通过预先加载,您只需运行一个额外的数据库查询,而不是为集合中的每个模型运行一个查询。

示例:

用户 > hasMany > 帖子

$users = User::with('posts')->get();
foreach($users as $user){
    $users->posts; // posts is already loaded and no additional DB query is run
}

has()是根据关系过滤选择模型。因此它的行为与正常的 WHERE 条件非常相似。如果您只使用 has('relation') 这意味着您只想获取在该关系中至少有一个相关模型的模型。

示例:

用户 > hasMany > 帖子

$users = User::has('posts')->get();
// only users that have at least one post are contained in the collection

哪里有

whereHas() 的工作原理与 has() 基本相同,但允许您为要检查的相关模型指定其他过滤器。

示例:

用户 > hasMany > 帖子

$users = User::whereHas('posts', function($q){
    $q->where('created_at', '>=', '2015-01-01 00:00:00');
})->get();
// only users that have posts from 2015 on forward are returned

关于Laravel - Eloquent "Has"、 "With"、 "WhereHas"- 它们是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30231862/

相关文章:

mysql - 在Sequelize的FROM子句中指定子查询

php - Laravel 入门

php - Laravel:如何查询多个间接相关的表?

java - Java Persistence API 中 FetchType LAZY 和 EAGER 的区别?

NHibernate 还是 Fluent NHibernate?

php - 是否可以获取城市集合但排除任何重复项?

php - 在 Eloquent 中使用连接

php - 拉维尔 5.3 : Sessions database not working as expected

php - 如何为同一个 Controller 使用 laravel Multiple Auth Guard