如何把含有別名和函式的sql轉成eloquent orm ?

環境:Laravel 8.7、php8.1、mysql5.7.xx

遇到的問題:
如何把這段sql轉成eloquent orm ?我嘗試許久一直卡住在date(mytimestamp) AS formatDate

SELECT *,date(`mytimestamp`) AS formatDate FROM `xxxTable` WHERE id<10 ORDER BY formatDate DESC;
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

我發現無法實作的原因是eloquent自身需做到跨資料庫平台考量,因此不可能面對各種資料庫款體他們的functions做出正確轉譯,就算相同的function在不同資料庫軟體用法有差異緣故。因而eloquent生出如Carbon這類的替代品讓coder自行去設計算法,只是在面對巨量複雜的資料運算與排序,Carbon顯得捉襟見軸。

我使用的DB多是mysql或mariadb,幾乎所有的function用法一樣,所以我想我還是使用DB:raw來做吧。

2年前 评论
讨论数量: 7
sanders

具体问题具体分析,从这条 SQL 来看,看不出必须使用函数后再进行排序的必要,所以可以直接排序,查询后再用 PHP 提供的方法进行转换,如果结合模型的话,可以使用模型属性的修改器功能:

public function getMyDateArttribute()
{
    return date('Y-m-d', $this->mytimestamp);
}

补充:

转念一想,更好的实现方式是将你这里的时间戳直接转成 Carbon 对象更合适一些,哪里显示就在那里转换成对应的格式。

2年前 评论
zhuzixian520
XXX::select([
   '*', 'date(`mytimestamp`) AS formatDate'
])->get();

我不知道,您是不是这个意思啊?

2年前 评论
rfrkk (楼主) 2年前

我發現無法實作的原因是eloquent自身需做到跨資料庫平台考量,因此不可能面對各種資料庫款體他們的functions做出正確轉譯,就算相同的function在不同資料庫軟體用法有差異緣故。因而eloquent生出如Carbon這類的替代品讓coder自行去設計算法,只是在面對巨量複雜的資料運算與排序,Carbon顯得捉襟見軸。

我使用的DB多是mysql或mariadb,幾乎所有的function用法一樣,所以我想我還是使用DB:raw來做吧。

2年前 评论
use Illuminate\Support\Facades\DB;

Model::query()->select([
   '*',
  DB::raw('date(`mytimestamp`) AS formatDate')
])->get();
2年前 评论

Model::query()->selectRaw(原生表达式) ->get() ;

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!