Расширение фасада БД Laravel - PullRequest
0 голосов
/ 23 октября 2018

Я хотел бы преобразовать временную метку и иметь некоторые другие значения, связанные с ней.У меня вопрос, как я могу представить свой собственный метод, такой как 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 голосов
/ 24 октября 2018

Спасибо @kamil за то, что показали мне дорогу.Я пишу ответ на случай, если кто-нибудь в будущем сочтет это полезным.Я придумал свой собственный метод, который помогает легко конвертировать часовой пояс без необходимости писать слишком много кода внутри 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 для DB фасада или внутри DB::raw() в случае, если вы обрабатываете гораздо более сложный запрос.Надеюсь, это кому-нибудь поможет.

0 голосов
/ 23 октября 2018

Первый взгляд здесь: 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(); 

и внутри вы можете легко управлять этим запросоми верните обновленную версию.


АЛЬТЕРНАТИВА: Если ваша цель - добавить несколько новых полей в Model (json), которые не существуют в БД, но вы можете использовать $appends (смотрите: мутаторы и добавляет )

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

    ...

    public function getConvertedCreatedAtAttribute() {

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