Laravel Eloquent链式方法中数据库查询执行时机及相关疑问
问题解答
1. 查询执行节点与数据截取方式
数据库查询实际在pluck()方法调用时触发执行——因为pluck()属于立即执行类的查询方法(和get()、first()一样,会终止查询构建链并向数据库发起请求)。
你当前的写法存在逻辑问题:take(10)是在pluck()之后调用的,这意味着数据库会先返回所有符合where/whereNotIn条件的tag数据,拿到Laravel Collection后,再由PHP在内存中截取前10条,并非从数据库层面直接获取10条数据。
如果要实现数据库层面只查询10条数据,需要把take(10)放到pluck()之前:
$tags = $user->tags()->where('tag', 'like', '%' . $tag . '%') ->whereNotIn('tag', $file_tags) ->take(10) ->pluck('tag') ->toArray();
2. pluck('tag')与select('tag')的区别
两者作用完全不同:
select('tag')只是设置查询的返回字段,属于查询构建方法,不会触发数据库查询,后续还可以继续链式调用其他构建方法(比如where、take)。pluck('tag')是立即执行查询的方法,它会直接生成SELECT tag FROM ...的SQL语句发送给数据库,返回只包含tag列值的Collection,并非先查询全量字段再由PHP过滤。
内容的提问来源于stack exchange,提问作者gema
相关产品推荐
相关产品推荐

