在列列表中使用"raw"列构建雄辩查询



我正在使用Eloquent构建一个查询,将一个列数组传递给get()方法,以指定我想要返回的列名;但我也想添加一个计算列

YEAR(CURDATE())-YEAR(`dateOfBirth`) - (DAYOFYEAR(CURDATE()) < DAYOFYEAR(`dateOfBirth`)) as AGE

我知道,如果我手动创建,我可以将WHEREHAVING子句的部分指定为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
);
);

张贴在这里是为了方便其他人找到任何解释如何做到这一点的文档。

最新更新