我想转换一个时间戳并具有其他一些与之相关的值。我的问题是如何引入自己的方法,例如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做到这一点,但我想看看如何使用外观来解决这个问题。 预先感谢您的帮助。
答案 0 :(得分:3)
首先在这里查看:https://stackoverflow.com/a/40615078/860099-尝试使用此扩展数据库外观:
namespace App\Facades;
use Illuminate\Support\Facades\DB as DBBase;
class DB extends DBBase {...}
并在config/app.php
中进行更改
'DB' => Illuminate\Support\Facades\DB::class,
到
'DB' => App\Facades\DB::class,`
(我从头开始写代码)
替代:
您可以轻松创建助手类,例如。 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
}
答案 1 :(得分:1)
感谢@kamil给我展示了方法。
我正在写一个答案,以防将来有人发现它有帮助。
我想出了自己的方法,该方法有助于轻松地转换时区,而无需在$getdata = file_get_contents("https://data.website.com/");
$datajson = json_decode($getdata);
$mydata = $datajson->whatiwant;
echo $mydata;
的{{1}}外观中为select query
编写太多代码。
我现在已经创建了一个像这样的文件。
DB
现在,如果要处理更复杂的查询,可以在PostgreSQL
立面的<?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
内部轻松调用此方法。
希望这对某人有帮助。