Laravel 5.6如何使用Doctrine\DBAL?安装后需额外配置吗?
嗨,作为Laravel新手有这些疑惑太正常啦,我来帮你把这些问题理清楚:
1. 安装Doctrine DBAL后还需要手动添加服务提供者吗?
不需要哦!在Laravel 5.5及以上版本中,Composer安装的包支持自动发现功能,Doctrine DBAL的包已经配置了自动发现的规则,所以安装完成后Laravel会自动帮你注册相关的服务提供者,完全不用手动去config/app.php里添加。
如果是非常老旧的Laravel版本(低于5.5),那才需要手动注册,但现在几乎没人用这么老的版本了,所以放心跳过这一步就好。
2. Laravel默认内置了部分Doctrine代码吗?
没错!Laravel确实部分集成了Doctrine DBAL组件,但并不是完整的Doctrine ORM或者全套DBAL功能。
Laravel的数据库系统(尤其是Schema表结构相关的操作)依赖了Doctrine DBAL的核心能力,比如跨数据库类型的表结构解析、字段类型转换等。你用到的getDoctrineSchemaManager()就是Laravel特意封装的方法,用来让开发者能调用Doctrine的Schema工具类。
但Laravel并没有内置完整的Doctrine栈,比如它没有封装Doctrine的Query Builder,也没有集成Doctrine ORM的实体管理等功能。
3. 为什么getDoctrineSchemaManager()能用,但createQueryBuilder()不行?
这是因为Laravel的Illuminate\Database\Connection类(也就是DB::connection()返回的实例)只封装了Doctrine DBAL的部分功能,getDoctrineSchemaManager()是Laravel特意暴露出来的方法,但createQueryBuilder()是Doctrine原生Connection类的方法,Laravel并没有直接把它挂在自己的连接实例上。
如果想要使用Doctrine的Query Builder,你需要先获取到Doctrine原生的Connection实例,代码示例如下:
use Illuminate\Support\Facades\DB; // 先拿到Laravel的连接实例,再获取Doctrine原生连接 $doctrineConnection = DB::connection('custom')->getDoctrineConnection(); // 现在就能调用Doctrine的Query Builder了 $queryBuilder = $doctrineConnection->createQueryBuilder(); // 举个使用例子 $users = $queryBuilder ->select('id', 'name') ->from('users') ->where('email', '=', 'example@test.com') ->execute() ->fetchAll();
这样就能正常使用Doctrine的Query Builder功能啦~
内容的提问来源于stack exchange,提问作者Deeeic

