我想转换一个时间戳,并有一些其他相关的值。我的问题是如何引入我自己的方法,比如DB::raw(),它将所有内容都附加到当前的select values上。因此,例如,对于像这样的东西
$user = DB::table('users')
->select('*', DB::timestamp('timestamp_column', 'convert_timezone', 'called_as'))
->where('id', 1)->first();假设我正在尝试获取created_at列的值,它被称为converted_created_at,它应该返回如下所示的内容。
{
id: 1,
name:'John Doe',
converted_created_at: {
'utc_time': 'created_at value as that is in utc by default',
'converted_time': 'timestamp converted into user timezone',
'diff': '10 hours ago' // difference between created_at and current timestamp
}
}那么,我该如何引入我自己的方法来实现这一点呢?您可以随意使用任何SQL数据库作为示例。我知道我可以用Model做到这一点,但我想看看如何使用facade来解决这个问题。提前感谢您的帮助。
发布于 2018-10-23 17:22:08
首先看这里:https://stackoverflow.com/a/40615078/860099 -试试这个扩展DB外观:
namespace App\Facades;
use Illuminate\Support\Facades\DB as DBBase;
class DB extends DBBase {...}在config/app.php change中
'DB' => Illuminate\Support\Facades\DB::class, 至
'DB' => App\Facades\DB::class,` (我从头开始写代码)
Alternative:你可以很容易地创建助手类,例如。DBTools是静态方法,在这些方法中,您将使用DB并构造适当的查询。并像DBTools::yourMethod(...)一样使用它
作为该方法的参数,您可以给出...这里的查询是调用此方法的示例
DBTools::yourMethod(User::query())->first(); 在内部,您可以轻松地操作该查询并返回更新的版本。
替代方案:如果您的目标是在模型(json)中添加一些在数据库中不存在但已生成的新字段,那么您可以使用$appends (查看:mutators和appends)
class User extends Model
{
protected $appends = ['converted_created_at'];
...
public function getConvertedCreatedAtAttribute() {
return ...; // return generated value from other fields/sources
}发布于 2018-10-24 16:21:31
感谢@kamil为我指路。我正在写一个答案,以防将来任何人发现这是有帮助的。我已经想出了我自己的方法,它可以帮助轻松地转换时区,而不需要在select query中为PostgreSQL的DB外观编写太多代码。我现在已经创建了一个这样的文件。
<?php
namespace App\Custom\Facade;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class DBTools extends DB
{
/**
* Convert a timestamp
* @param $timestamp - timestamp to be converted
* @param bool $insideRaw - if this helper method is getting used inside DB::raw() method
* @param null $timezone
* @param null $format - time format
* @param null $calledAs - column to called as
* @return \Illuminate\Database\Query\Expression|string
*/
public static function convertTime($timestamp, $insideRaw = false, $timezone = null, $format = null, $calledAs = null)
{
if (Auth::check()) {
if (!$timezone)
$timezone = Auth::user()->timezone;
if (!$format)
$format = Auth::user()->time_format;
}
$query = "to_char($timestamp at time zone '$timezone', '$format')" . ($calledAs ? " as $calledAs" : '');
if (!$insideRaw) {
return DB::raw($query);
}
return $query;
}
}现在,可以很容易地在select内为DB facade调用它,或者在DB::raw()内调用它,以防您处理更复杂的查询。希望这对某些人有帮助。
https://stackoverflow.com/questions/52944843
复制相似问题