MYSQL против красноречивого Laravel

#php #mysql #laravel #eloquent #mysql-workbench

Вопрос:

Я пытаюсь преобразовать запрос MYSQL в формат Laravel Eloquent, версия MYSQL возвращает значение на рабочем столе MySQL, но версия Eloquent возвращает нулевое значение с теми же параметрами запроса.

вот версия запроса MYQSL

  " select
      SUM(
         DATEDIFF(
          if( end_date > $end_date, $end_date, end_date ),
          if( start_date < $start_date, $start_date, start_date )
         ) * child_rate
        )
    from rates where start_date < $end_date and end_date > $start_date


  ";
 

вот красноречивая версия Ларавеля

 $rate_query = "
        SUM(
         DATEDIFF(
          if( end_date > $end_date, $end_date, end_date ),
          if( start_date < $start_date, $start_date, start_date )
         ) * child_rate
        )
       ";

$total_child_rate = DB::table('rates')
                            ->selectRaw(DB::raw($rate_query))
                            ->where('start_date', '<', $end_date)
                            ->where('end_date', '>', $start_date)
                            ->get();

 

что я делаю не так?

Edited this question to show the answer below

Правильный способ написания необработанного запроса-это обернуть запрос в a single qoute . Ниже приведено решение проблемы после ответа @damask

 $rate_query = '
        SUM(
         DATEDIFF(
          if( end_date > ?, ?, end_date ),
          if( start_date < ?, ?, start_date )
         ) * child_rate
        )
       ';
        $total_child_rate = DB::table('rates')
                            ->selectRaw(DB::raw($rate_query), [$end_date, $end_date, $start_date, $start_date])
                            ->where('start_date', '<', $end_date)
                            ->where('end_date', '>', $start_date)
                            ->get();
 

Ответ №1:

Может быть, потому, что вы устанавливаете $rate_query , используя двойные кавычки, $end_date и $start_date оцениваетесь как переменные php? Попробуйте использовать одинарные кавычки или сейчас ?

Комментарии:

1. Я думаю, что $end_date и $start_date являются переменными php, поэтому он использует их для сравнения внутри оператора if.

2. да @damask @Sandeep вы, ребята, правы, я изменил $rate_query использование одинарной кавычки, и я получу значение, я отредактирую вопрос, чтобы показать правильный запрос

Ответ №2:

Используйте телескоп Laravel, чтобы просмотреть выходные данные запроса и сравнить их с вашим необработанным запросом.