我正在使用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时,我遇到了相同的错误。
嗯,首先,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_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