Cast datetime在选择原始查询构建器上不起作用,但雄辩就可以了

问题描述 投票:0回答:1

我正在使用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);
    }

///...
}

当我将此模型绑定到路由器时,它可以正常工作,但是当我调用:(new Task)-> 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:当我尝试将'start_date'设置为$ dates时,我遇到了相同的错误。

php laravel-5.7
1个回答
0
投票

嗯,首先,list()方法应该是您的控制器的一部分,并且您应该使用Laravel本机关系处理程序……看看official documentation

无论如何,问题是$cast变量试图将查询结果转换为Carbon object,然后将结果格式化为Carbon格式。但是输入不是时间戳,它只是一个字符串(因为您正在查询中运行Y/m/d H:i:s)。这就是引发异常的原因。

如果您想使用DATE_FORMAT(com_tasks.start_date, "%Y/%m/%d %H:%i:%s") as start_datestart_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_atstart_date属性被实例化为due_date对象。

Carbon
© www.soinside.com 2019 - 2024. All rights reserved.