【问题标题】:Extending DB facade Laravel扩展 DB 外观 Laravel
【发布时间】:2019-03-27 10:38:27
【问题描述】:

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

【问题讨论】:

  • 我再次更新我的答案

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


【解决方案1】:

首先看这里: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(...)

作为该方法的参数,您可以给出...这里的QUERY是调用此方法的示例

DBTools::yourMethod(User::query())->first(); 

您可以在内部轻松操作该查询并返回更新版本。


替代方案:如果您的目标是在模型 (json) 中添加一些在 db 中不存在但已生成的新文件,那么您可以使用 $appends(查看:mutatorsappends

class User extends Model
{
    protected $appends = ['converted_created_at'];

    ...

    public function getConvertedCreatedAtAttribute() {

        return ...; // return generated value from other fields/sources
    }

【讨论】:

  • 非常感谢。这给了我关于现在如何进行的想法。
【解决方案2】:

感谢@kamil 为我指路。 我正在写一个答案,以防将来有人觉得这很有帮助。 我想出了我自己的方法,它有助于轻松转换时区,而无需在select query 中为DBPostgreSQL 编写太多代码。 我现在已经创建了一个这样的文件。

<?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 外观或内部 DB::raw() 以防您处理更复杂的查询。 希望这可以帮助某人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-07
    • 2018-11-18
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 2016-02-14
    • 2018-01-09
    相关资源
    最近更新 更多