扩展数据库立面Laravel

时间:2018-10-23 08:47:41

标签: php laravel laravel-5 laravel-4 eloquent

我想转换一个时间戳并具有其他一些与之相关的值。我的问题是如何引入自己的方法,例如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做到这一点,但我想看看如何使用外观来解决这个问题。 预先感谢您的帮助。

2 个答案:

答案 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(外观:mutatorsappends

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内部轻松调用此方法。 希望这对某人有帮助。