Laravel 5.8 условно вставляя SQL-фрагмент - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь найти лучший способ решить проблему вставки условного фрагмента SQL в функцию приложения laravel 5.8.

Я успешно вызываю функцию с параметром запроса $type.

$type входящий в эту функцию может быть 1,2 или 3 (когда 3 я в основном хочу, чтобы запрос sql выполнялся ни с чем в этом месте), но в настоящее время он успешно возвращает результаты запроса снизу, как будто ничего не происходит. вводится вообще. Я могу вывести $ typeCondition на основе выбора, и он переключается правильно, поэтому я знаю, что typeCondition устанавливается правильно, но похоже, что он на самом деле не подключает typeCondition к запросу, и я получаю одни и те же результаты каждый раз, так чтоможет быть, это проблема синтаксиса?

Если я запускаю приведенную ниже версию как просто :typeCondition, она выдает ошибку и говорит, что это недопустимый вызов param.

Что мне делать здесь?

public static function gatherReporting($type) {

    if($type ==1){
      $typeCondition = 'AND T1 . parent_id IS NOT NULL';
    }elseif($type ==2){
      $typeCondition = 'AND T1 . parent_id IS NULL';
    }else{
      $typeCondition = '';
    }

    $sql = "
        SELECT * 
        FROM   SCHEMA . TABLE T1
        WHERE ACTIVE = 1
        {:typeCondition}
        INNER JOIN SCHEMA . TABLE2 T2
        ON T1.ID = T2.ID
    ";
    return DB::connection('odbc')->select($sql,  [
                'typeCondition' => $typeCondition
            ]);
}

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Вы можете обработать запрос как string и объединить его с вашей переменной. Вот так:

$sql = "SELECT * FROM SCHEMA . TABLE T1 WHERE ACTIVE = 1" . $typeCondition . "INNER JOIN SCHEMA . TABLE2 T2 ON T1.ID = T2.ID";
0 голосов
/ 09 октября 2019

Вы можете использовать Query Builder, чтобы получить что-то чистое:

$query = Schema::select('*')->where('active', 1);

if ($type === 1) {
    $query->whereNotNull('parent_id');
} elseif ($type === 2) {
    $query->whereNull('parent_id');
}

$data = $query->get();
...