Php Cast datetime不在select原始查询生成器上工作,但eloquent正常

Php Cast datetime不在select原始查询生成器上工作,但eloquent正常,php,laravel-5.7,Php,Laravel 5.7,我使用的是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', 'du

我使用的是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);
    }

///...
}
当我将这个模型绑定到路由器时,它可以正常工作,但当我调用:(newtask)->list($conditions)时;我得到一个错误:

{"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:当我尝试将“开始日期”设置为$dates时,我得到了相同的错误。

首先,
list()
方法应该是控制器的一部分,并且您应该使用Laravel本机关系处理程序。。。看一看这张照片

无论如何,问题是,
$cast
变量试图将查询结果转换为,然后将结果格式化为
Y/m/dh:i:s
格式。但是输入不是时间戳,它只是一个字符串(因为您正在查询中运行
DATE\u格式(com\u tasks.start\u DATE,“%Y/%m/%d%H:%i:%s”)作为开始日期。这就是抛出异常的原因

如果要使用
$cast
$dates
属性,只需恢复
开始日期
到期日期
列即可。您的代码将成为:

$result=$this->select(
“com_tasks.id”,
“com_tasks.name”,
“com_tasks.done”,
“com_task_status.id作为status_id”,
“com_task_status.name作为status_name”,
“com_task_status.color作为状态_color”,
“com_projects.name作为项目名称”,
“com_projects.name作为受让人_name”,
“com_tasks.start_date作为start_date”,
“com_tasks.due_date作为到期日”,
)
->leftJoin('com\u task\u status'、'com\u tasks.status\u id'、'com\u task\u status.id')
->leftJoin('com_projects'、'com_tasks.project_id'、'com_projects.id');
$per_page=$params['per_page']??配置('pagination.per_page');
返回$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);
    }
}
在控制器/刀片视图/任何调用中,自从
处删除后,
开始日期
到期日期
属性被实例化为
对象

// ... 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'); }}

非常感谢,我知道原因是什么。我将尝试雄辩的关系。您的代码与select语句配合良好,但当我尝试更新或保存时,会出现相同的错误。我对$dates进行注释,然后它就可以工作了。在迁移中,开始日期和截止日期是时间戳。在存储/更新中是相同的。您必须将
开始日期
/
到期日期
设置为碳对象