Кастинг varchar на сегодняшний день, где запрос Laravel 5.2 - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь выбрать коллекцию данных из диапазона, используя дату в качестве столбца сортировки. Но проблема в том, что дата в моей таблице сохраняется как строка varchar.

ПРИМЕЧАНИЕ. Тип поля varchar должен оставаться неизменным, поскольку он используется какой-либо неосновной, устаревшей кодовой базой, и я прерву службу, если изменить ее на тип даты.

Я пытался разыграть его, но он не работает.

Это код в контроллере

        switch ($range) {
        case 'thisWeek':
            $start = Carbon::now()->startOfWeek()->format('d-m-y');
            $end = Carbon::now()->endOfWeek()->format('d-m-Y');     
            break;

        case 'thisMonth':
            $start = Carbon::now()->startOfMonth()->format('d-m-Y');
            $end = Carbon::now()->endOfMonth()->format('d-m-Y');
            // dd($start, $end);
            break;


        case 'last90Days':
            $start = Carbon::now()->format('d-m-Y');
            $end = Carbon::now()->subDays(90)->format('d-m-Y');

            // dd($start, $end);
            break;

        case 'last30Days':
            $start = Carbon::now()->format('d-m-Y');
            $end = Carbon::now()->subDays(30)->format('d-m-Y');
            break;


        case 'year':
            $start = Carbon::now()->format('d-m-Y');
            $end = Carbon::now()->year;
            $end = "31-12-". $end;
            break;

        // case 'all':
        //  $route = $name .".". "index";
        //  return redirect()->Route($route);

        default:
            session()->flash("alert-danger", "no range selected");
            return redirect()->back();
            break;
    }

    if($name=="activitylog"){

        // return $start . ' <br>' . $end;

        $logs = Payment::where("payDate", '<', $start)->where("payDate", ">", $end)->
                        orderBy("payDate", "DESC")->
                        paginate(20);
    }
    else{
        $logs = Payment::where("description", $description[$name])->
                    where("payDate", '=<', $start)->where("payDate", ">=", $end)->
                    orderBy("payDate", "DESC")->
                    paginate(20);   

модель:

<?php

namespace App\Models\Admin;

use Illuminate\Database\Eloquent\Model;

class Payment extends Model
{
    protected $table = "payments";
    public $timestamps = false;
    protected $cast = ["payDate"=> "DATE"];
}

Когда пользователь делает запрос на любой из диапазонов, я хочу сравнить и дать ответ.

dates example

изображение для конфигурации базы данных выше и структура ниже table structure

1 Ответ

0 голосов
/ 02 июля 2018

Вам нужно будет использовать функцию STR_TO_DATE в mysql.

Исходный SQL-запрос, который вы ищете:

Посмотри в действии: http://sqlfiddle.com/#!9/a40090/8

select * from `test` where str_to_date(`payDate`, '%d-%m-%Y') > str_to_date('31-12-2007', '%d-%m-%Y');

С помощью STR_TO_DATE вы указываете MySQL, в каком формате отформатирована дата, что помогает MySQL возвращать правильную дату для сортировки и тому подобное.

Ваш Eloquent запрос будет выглядеть примерно так:

 /** put it like this so we don't have to repeat it everywhere where needed **/
 $paydate_raw = DB::raw("STR_TO_DATE(`payDate`, '%d-%m-%Y')");

 /** encoding the raw query. the ? is populated by setBindings() **/
 $start_raw = DB::raw("STR_TO_DATE(?, '%d-%m-%Y')");
 $end_raw = DB::raw("STR_TO_DATE(?, '%d-%m-%Y')");


  $query = Payment::where($paydate_raw, '<', $start_raw)->where($paydate_raw, ">", $end_raw)->
                    orderBy('paydate', "DESC")->
                    setBindings([$start, $end])->
                    paginate(20);
  // debugging output.
  //echo $query->toSql();

Обратите внимание, что приведенный выше код является просто концепцией, я не проверял его, но он должен работать. Взгляните также на скрипку SQL, чтобы увидеть, как она должна реагировать в сыром виде.

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