如何把含有別名和函式的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;
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

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

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

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

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

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

补充:

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

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

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

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

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

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

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

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

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

3年前 评论

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