Как искать объединенные поля с MySQL в рабочей среде и sqlite при тестировании с Laravel - PullRequest
0 голосов
/ 18 мая 2018

У меня есть настоящий хакерский способ заставить мои тесты пройти, когда я ищу объединенное поле.Например, я храню своих пользователей как first_name, last_name, поэтому, когда я приду к поиску, я сделаю что-то вроде этого.

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

Однако вы получаете ошибку при тестировании (при использовании sqlite), потому что это нене имеет функции concat.Для этого вы должны использовать что-то вроде этого.

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

Не имея проверки, чтобы проверить, тестирует ли ваша среда, как вы будете искать это, которое будет работать в обеих базах данных?

1 Ответ

0 голосов
/ 18 мая 2018

Хотя это и не идеально, вы можете проверить переменные .env на лету с помощью env("KEY"), чтобы вы могли свернуть свои функции в проверку:

if(env("APP_ENV", "production") == "production"){
  ExampleModel::whereRaw("first_name || ' ' || surname LIKE '%".$term."%'");
} else {
  ExampleModel::whereRaw("CONCAT(first_name, ' ', surname) LIKE '%".$term."%'");
}

В приведенном выше случае яПредполагая, что APP_ENV=production в вашем .env файле означает, что вы используете SQLite вместо MySQL, и корректируете запрос для обработки.

Обратите внимание, что это не идеально, так как отдельный Model классы могут определять свое собственное соединение через protected $connection = "mysql"; // sqlite, etc, и приведенная выше логика не поймает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...