Php Cast datetime不在select原始查询生成器上工作,但eloquent正常
我使用的是laravel 5.7,模型如下: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
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进行注释,然后它就可以工作了。在迁移中,开始日期和截止日期是时间戳。在存储/更新中是相同的。您必须将开始日期
/到期日期
设置为碳对象