首先要清楚一个概念,什么是ORM?
ORM(Object Relational Mapping,对象关系映射),作用是在关系型数据库和对象之间作一个映射,这样我们在具体的操作数据库的时候,就不需要再去写sql语句了,只要像平时操作对象一样操作它就可以了。
而N+1问题就是使用ORM关联数据读取中存在的问题,一般发生在关联数据的遍历时。
概念
在一对多或多对多的情况下,比如:查询1次主数据,获得N条记录,然后再根据这N条记录查询N次才能获取到所有从数据,所以共进行了N+1次查询,会带来性能问题,我们称之为N+1问题。
解决方案
可以通过Eloquent(laravel内置的一个ORM实现)提供的预加载功能解决N+1的问题。
使用with()方法提前加载并缓存需要用到的关联属性,等到遍历数据时,就不会再产生多余的sql查询。
$topics = Topic::with('user', 'category')->paginate(30);
return view('topics.index', compact('topics'));