Php 在使用Laravel进行测试时,如何在生产和sqlite中使用MySQL搜索连接字段

Php 在使用Laravel进行测试时,如何在生产和sqlite中使用MySQL搜索连接字段,php,laravel,Php,Laravel,当我搜索一个连接的字段时,我有一个真正的黑客方法试图让我的测试通过。例如,我将我的用户存储为first_name,last_name,所以当我开始搜索时,我会这样做 ExampleModel::where(DB::raw("concat(first_name, ' ', surname)"), 'LIKE', "%$term%")->get() ExampleModel::where(DB::raw("first_name || ' ' || surname") , 'LIKE', "%

当我搜索一个连接的字段时,我有一个真正的黑客方法试图让我的测试通过。例如,我将我的用户存储为first_name,last_name,所以当我开始搜索时,我会这样做

ExampleModel::where(DB::raw("concat(first_name, ' ', surname)"), 'LIKE', "%$term%")->get()
ExampleModel::where(DB::raw("first_name || ' ' || surname") , 'LIKE', "%$term%")->get()
但是,在测试时(使用sqlite时)会出现错误,因为它没有concat函数。对于这一点,你可以使用类似这样的东西

ExampleModel::where(DB::raw("concat(first_name, ' ', surname)"), 'LIKE', "%$term%")->get()
ExampleModel::where(DB::raw("first_name || ' ' || surname") , 'LIKE', "%$term%")->get()

如果不检查您的环境是否正在测试,您将如何搜索这两个数据库都可以使用的变量?

虽然不理想,但您可以通过
env(“KEY”)
动态检查
.env
变量,这样您就可以在检查中包装您的函数:

if(env("APP_ENV", "production") == "production"){
  ExampleModel::whereRaw("first_name || ' ' || surname LIKE '%".$term."%'");
} else {
  ExampleModel::whereRaw("CONCAT(first_name, ' ', surname) LIKE '%".$term."%'");
}
在上面的例子中,我假设
.ENV
文件中的
APP_ENV=production
表示您正在使用
SQLite
而不是
MySQL
,并调整查询以处理


请注意,这并不完美,因为单个
Model
类可以通过
protected$connection=“mysql”//定义自己的连接sqlite等
而上述逻辑无法捕捉到这一点。

问题在于在生产和测试中使用不同的数据库。会有很多不同之处,你不会仅仅因为某个东西在测试中起作用就知道它是否起作用。@bencarter78这是你问题的解决方案,毫无疑问。。。但是根据最佳实践,您的db引擎应该在开发和生产中都匹配。否则,您将努力匹配不同环境中的所有依赖项。可能会出现很多问题。因此,我们的想法是在dev中迁移到mysql以匹配您的产品。为什么不呢?Mysql安装在所有平台上都非常简单,它将在一开始就解决您的问题。。。