- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想对关系应用where
条件。这是我的做法:
Replay::whereHas('players', function ($query) {
$query->where('battletag_name', 'test');
})->limit(100);
它生成以下查询:
select * from `replays`
where exists (
select * from `players`
where `replays`.`id` = `players`.`replay_id`
and `battletag_name` = 'test')
order by `id` asc
limit 100;
在 70 秒内执行。如果我像这样手动重写查询:
select * from `replays`
where id in (
select replay_id from `players`
where `battletag_name` = 'test')
order by `id` asc
limit 100;
它在 0.4 秒内执行。如果 where exists
这么慢,为什么它是默认行为?有没有一种方法可以使用查询构建器生成正确的where in
查询,或者我是否需要注入(inject)原始 SQL?也许我完全做错了什么?
replays
表有 4M 行,players
有 40M 行,所有相关列都已索引,数据集不适合 MySQL 服务器内存。
更新:发现可以生成正确的查询为:
Replay::whereIn('id', function ($query) {
$query->select('replay_id')->from('players')->where('battletag_name', 'test');
})->limit(100);
还有一个问题,为什么 exists
表现如此糟糕,为什么它是默认行为
最佳答案
laravel has(whereHas)
有时慢的原因是用 where exists 语法实现的。
例如:
// User hasMany Post
User::has('posts')->get();
// Sql: select * from `users` where exists (select * from `posts` where `users`.`id`=`posts`.`user_id`)
'exists'语法是循环到外部表,然后每次都查询内部表(subQuery)。
但是当users表有大量数据时会出现性能问题,因为上面的sql select * from 'users' where exists...
无法使用索引。
它可以在这里使用where in
而不是where exists
而不破坏结构。
// select * from `users` where exists (select * from `posts` where `users`.`id`=`posts`.`user_id`)
// =>
// select * from `users` where `id` in (select `posts`.`user_id` from `posts`)
这将大大提高性能!
我推荐你试试这个包hasin ,在上面的例子中,你可以使用hasin
代替has
。
// User hasMany Post
User::hasin('posts')->get();
// Sql: select * from `users` where `id` in (select `posts`.`user_id` from `posts`)
与框架has
相比,hasin
只是只使用了where in语法,而不是where exists,但是其他地方都是一样的,比如参数和调用方式,甚至是代码实现,都可以放心使用。
关于php - Laravel 的 whereHas 表现不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46785552/
我正在从某个数据范围中选择所有ScheduledPrograms,其中包含属于某个用户的参加者。我想添加一个过滤器以仅选择数据透视字段 registered=1 所在的 SchduledProgram
我正在使用 Eloquent 构建应用程序并遇到了麻烦,我正在使用多对多 Pivot 关系。 引用:https://laravel.com/docs/5.0/eloquent#many-to-many
我有三个表: 交易模式: class Deal extends Model { protected $guarded = ['id']; public function hotel()
如何查询关系并仍然包含没有关系的模型?有两种型号 商店 产品 代码 // Store public function products() { $this->belongsToMany('App
这是我在这里发表的第一篇文章,所以请原谅任何错误:) 我目前正在从事库存管理应用程序(Laravel)的项目。我已经到了我所做的一切都不起作用的地步,所以现在我请求帮助。 我有一个包含产品的表,其中一
我有三个型号 Period , Post , User : period和 posts在 period_posts 上有 M:N 关系 posts和 user在 views 上有 M:N 关系 期间型
我正在努力避免 DRY在我的查询构建器中,特别是在链中添加额外的方法。 例如,这最初是我拥有的查询构建器: $products = $app->myShop->realProducts()
所以我想获得最后状态等于给定状态的请求我试过 first() 但它给了我一个错误并且限制不起作用 $requests = Request::whereHas('requestStatus', func
我有两个具有一对多关系的表。 预订 - (id) booking_tasks - (id, booking_id,user_id) 一个预订有很多任务一项任务有一个预订 预订模式: public f
我发现这些方法背后的概念和含义有点令人困惑,是否有人可以向我解释一下 has 和 with 之间的区别是,在示例的上下文中(如果可能的话)? 最佳答案 与 with() 用于急切加载。这基本上意味着,
我正在使用新的 whereHas 方法在 Laravel 4.1 中添加对急切加载关系的约束。 $broadcast = $broadcast->whereHas('season', function
我有两个表 - 联系人和访问: 联系人表 id | name ----- | ------- 1 | Joe 2 | Sally 访问表 id | con
我有两个具有多对多关系的主表和一个数据透视表。 模型“类型” public function attributes() { return $this->belongsT
假设我有两个模型, Block 和Slot 各自的表结构为:- blocks(id, name); slots(id, block_id, time, status); slots.status 的值
这是 Laravel 5 应用程序中 Eloquent 类之间的一些关系: B属于A B有一个C 表是用正确的外键构建的。这是 A 的作用域方法: public function scopeMySco
基于公寓查找器,显示/返回所有具有公寓的类型,基于表单搜索。这是使用 whereHas 查询完成的。 例如: A user has different choices; a garden/balcon
我使用此查询过滤掉具有城市和类别的商店。当我在 stores 表中有大约 1000 条记录时,它工作正常。现在,当我有 5000 条记录时,生成结果大约需要 3-10 秒。 在我的案例中,一家商店属于
这个问题是关于:Laravel (5.3) Eloquent - Relationship issue , 请访问此 url 以获取更多信息。 我最终得到了以下脚本: $genres = ['acti
问题:我只想在客户已经下了当年的订单的情况下获得他们。客户和订单位于两个单独的数据库中(这不能更改)。这些关系都已设置并正常工作,但是当我尝试以下操作时,我不断收到 SQL 错误,因为它试图在“客户”
目前我的模型集合中有这个 whereHas: $query = self::whereHas('club', function($q) use ($search) { $q->whereHas
我是一名优秀的程序员,十分优秀!