我正在使用Eloquent构建一个查询,将一个列数组传递给get()
方法,以指定我想要返回的列名;但我也想添加一个计算列
YEAR(CURDATE())-YEAR(`dateOfBirth`) - (DAYOFYEAR(CURDATE()) < DAYOFYEAR(`dateOfBirth`)) as AGE
我知道,如果我手动创建,我可以将WHERE
或HAVING
子句的部分指定为raw
,或者将整个查询指定为raw
;但我更愿意使用Eloquent流畅的界面来构建查询。
有没有什么方法可以将SELECT
列表中的这一列定义为raw
,这样Eloquent就不会将其封装在backticks中?
编辑
或者,有没有任何方法可以定义模型,也许是通过回调,创建一个age属性,并在填充模型时用PHP计算值?
或者,我有没有任何方法可以定义模型,也许可以通过回调,创建年龄属性,并在填充模型时用PHP计算值?
您希望模型中有一个访问者。
public function getAgeAttribute() {
// do an age calculation on $this->dateOfBirth here
return $age;
}
然后调用$model->age
将吐出计算结果。
在检查了Eloquent代码,并注意到(除了*
)传递给查询get()
方法的字段数组中的所有条目都被反标记包裹,除非它们是QueryExpression
对象,否则我提出的解决方案是:
$joins = [
];
$columnnames = [
'id',
'roleId',
'category'
]
$calculatedFields = [
new IlluminateDatabaseQueryExpression(
"YEAR(CURDATE())-YEAR(`dateOfBirth`) - (DAYOFYEAR(CURDATE()) < DAYOFYEAR(`dateOfBirth`)) as age",
),
new IlluminateDatabaseQueryExpression(
"CONCAT(`forename`, ' ', `surname`) as fullname",
),
];
$modelName = 'User';
$query = (empty($joins)) ?
(new $modelName)->newQuery() :
(new $modelName)->with($this->joins);
$results = $query
->get(
array_merge(
$columnNames,
$calculatedFields
);
);
张贴在这里是为了方便其他人找到任何解释如何做到这一点的文档。