Приведение даты и времени не работает на выбранном необработанном конструкторе запросов, но красноречивый в порядке - PullRequest
1 голос
/ 30 сентября 2019

Я использую laravel 5.7 и имею такую ​​модель:

class Task extends Model
{
    use SoftDeletes;

    protected $table = 'com_tasks';
    ///...
    //protected $dates = ['deleted_at'];
    protected $casts = [
         'start_date'  => 'datetime:Y/m/d H:i:s',
         'due_date' => 'datetime:Y/m/d H:i:s',
    ];

    /**
     * get list data
     *
     * @param  $params
     * @return array list com_tasks
     */
    public function list($params=[])
    {
        $result = $this->select(
            'com_tasks.id',
            'com_tasks.name',
            'com_tasks.done',
            'com_task_status.id AS status_id',
            'com_task_status.name AS status_name',
            'com_task_status.color AS status_color',
            'com_projects.name AS project_name',
            'com_projects.name AS assignee_name'
        )
        ->selectRaw(DB::raw('
            DATE_FORMAT(com_tasks.start_date, "%Y/%m/%d %H:%i:%s") as start_date,
            DATE_FORMAT(com_tasks.due_date, "%Y/%m/%d %H:%i:%s") as due_date
        '))
        ->leftJoin('com_task_status', 'com_tasks.status_id', 'com_task_status.id')
        ->leftJoin('com_projects', 'com_tasks.project_id', 'com_projects.id');

        $per_page = $params['per_page'] ?? config('pagination.per_page');
        return $result->orderBy('id', 'DESC')->paginate($per_page);
    }

///...
}

Когда я связываю эту модель с маршрутизатором, она работает нормально, но когда я звоню: (новая задача) -> список ($условия);Я получаю сообщение об ошибке:

{"status":false,"message":"Unexpected data found.
Unexpected data found.","class":"InvalidArgumentException","file":"D:\\Projects\\backend\\vendor\
esbot\\carbon\\src\\Carbon\\Carbon.php","line":909,"code":0}

Но когда я комментирую переменную $ casts, она работает. Почему это произошло?

P / S: когда я пытаюсь установить 'start_date' в $ date, я получаю ту же ошибку.

1 Ответ

2 голосов
/ 30 сентября 2019

Ну, во-первых, метод list() должен быть частью вашего контроллера, а также вы должны использовать собственные обработчики отношений Laravel ... Посмотрите официальную документацию .

В любом случае, проблема в том, что переменная $cast пытается преобразовать ваш результат запроса в Carbon объект , а после этого отформатируйте результат в формате Y/m/d H:i:s. Но ввод не является отметкой времени, это просто строка (потому что вы выполняете DATE_FORMAT(com_tasks.start_date, "%Y/%m/%d %H:%i:%s") as start_date в вашем запросе). Вот почему возникает исключение.

Вы должны просто восстановить столбцы start_date и due_date, если хотите использовать атрибуты $cast или $dates. Ваш код станет:

$result = $this->select(
    'com_tasks.id',
    'com_tasks.name',
    'com_tasks.done',
    'com_task_status.id AS status_id',
    'com_task_status.name AS status_name',
    'com_task_status.color AS status_color',
    'com_projects.name AS project_name',
    'com_projects.name AS assignee_name',
    'com_tasks.start_date AS start_date',
    'com_tasks.due_date AS due_date',
            )
->leftJoin('com_task_status', 'com_tasks.status_id', 'com_task_status.id')
->leftJoin('com_projects', 'com_tasks.project_id', 'com_projects.id');

$per_page = $params['per_page'] ?? config('pagination.per_page');
return $result->orderBy('id', 'DESC')->paginate($per_page);

Как я писал в начале, лучшее решение, во всяком случае, должно быть:

class Task extends Model
{
    use SoftDeletes;

    protected $table = 'com_tasks';

    protected $dates = ['deleted_at', 'start_date', 'due_date'];

    /**
     * get list data
     *
     * @param  $params
     * @return array list com_tasks
     */
    public function list($params=[])
    {
        $per_page = $params['per_page'] ?? config('pagination.per_page');

        return $this->with(['taskStatus', 'project'])->orderBy('id', 'DESC')->paginate($per_page);
    }

    public function taskStatus()
    {
        return $this->belongsTo(TaskStatus::class);
    }

    public function project()
    {
        return $this->belongsTo(Project::class);
    }
}

и в виде контроллера / блейда / любого вызоваметод форматирования, поскольку атрибуты deleted_at, start_date и due_date создаются как Carbon объекты.

// ... your code
$model->start_date->format('Y/m/d H:i:s');

// ... your blade view

{{ $model->start_date->format('Y/m/d H:i:s'); }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...