Laravel 拉雷维尔-雄辩的“有”、“有”、“哪里有”-它们是什么意思?

Laravel 拉雷维尔-雄辩的“有”、“有”、“哪里有”-它们是什么意思?,laravel,orm,eloquent,relational-database,relationship,Laravel,Orm,Eloquent,Relational Database,Relationship,我发现这些方法背后的概念和含义有点令人困惑,有人可以在一个例子中解释has和with之间的区别吗 带的是急装。这基本上意味着,沿着主模型,Laravel将预加载您指定的关系。如果您有一组模型,并且希望为所有模型加载一个关系,那么这将特别有用。因为使用渴望加载时,您只运行一个额外的DB查询,而不是针对集合中的每个模型运行一个查询 例如: 用户>hasMany>帖子 有 has是根据关系过滤选择模型。因此,它的行为非常类似于正常的WHERE条件。如果您只使用has'relation',这意味着您只想

我发现这些方法背后的概念和含义有点令人困惑,有人可以在一个例子中解释has和with之间的区别吗 带的是急装。这基本上意味着,沿着主模型,Laravel将预加载您指定的关系。如果您有一组模型,并且希望为所有模型加载一个关系,那么这将特别有用。因为使用渴望加载时,您只运行一个额外的DB查询,而不是针对集合中的每个模型运行一个查询

例如:

用户>hasMany>帖子

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

例如:

用户>hasMany>帖子

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

例如:

用户>hasMany>帖子

已经解释了用法。 所以我用SQL来解释这些方法

例子: 假设有一个订单,订单中有许多OrderItem订单项

你已经建立了他们之间的关系

//应用程序\模型\订单: 公共功能订单项{ return$this->hasMany'App\Models\OrderItem'、'order\u id'、'id'; } 这三种方法都基于关系

具有 结果:返回模型对象及其相关结果

优点:快速加载,可防止N+1问题

当您使用以下雄辩的生成器时:

订单::带有'orderItems'->get; Laravel将此代码更改为仅两个SQL:

//获取所有订单: 从订单中选择*; //根据上述订单id获取订单项目 从order_items中选择*,其中order_items.order_id位于1,2,3,4。。。; 然后,laravel通过外键将第二个SQL的结果与第一个SQL的结果进行合并。最后返回采集结果

因此,如果在闭包中选择了不带外键的列,则关系结果将为空:

Order::with['orderItems'=>函数$query{ //$query->sum'quantity'; $query->select'quantity';//不带'order\u id` } ]->得到; =>结果: [{id:1, 代码:“00001”,
订单项:[],//+1,非常有用的答案!还要注意,虽然with'relation'将在返回的集合中包括相关表的数据,但是has'relation'和whereHas'relation'将不包括相关表的数据。因此,您可能需要同时使用'relation'和has或whereHas调用。欢迎回答,如何从关系模式访问父模型l例如,这里如何根据用户的属性搜索帖子模型model@BhojendraNepal不幸的是,文档中似乎没有太多关于它的内容……只有几段down@hussainfrotan同样,在查询post时使用Where Has on用户关系。好奇,在Laravel文档中:,当使用Where Has时,它使用use Illuminate\Database\Eloquent\Builder;然后是functionBuilder$query。我看到的大多数示例都使用生成器,只需传入$query,哪种方法正确?
$users = User::with('posts')->get();
foreach($users as $user){
    $users->posts; // posts is already loaded and no additional DB query is run
}
$users = User::has('posts')->get();
// only users that have at least one post are contained in the collection
$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