Фильтрация поля где хранится дата в формате timestamp()

StalkerClasses

Новичок
Кстати, а зачем хранить timestamp? datetime что ли строкой хранится?
Так сделано из коробки...

where created_at between (new DateTime("2021-01-13"))->getTimestamp() and (new DateTime("2021-01-14"))->getTimestamp()
Мне получается все равно нужно корректировать 5 стандартных методов...
Я бы хотел использовать ларавелевские с timestamp

Код:
// $q->whereDay('created_at', '=', date('d'));
// $q->whereMonth('created_at', '=', date('m'));
// $q->whereYear('created_at', '=', date('Y'));
// $q->where(DB::raw("DATE(created_at) = '".date('Y-m-d')."'"));
 
// whereDate() // ->whereDate('created_at', date('Y-m-d'))
// whereMonth() // ->whereMonth('created_at', '05')
// whereDay() // ->whereDay('created_at', '05')
// whereYear() // ->whereYear('created_at', '05')
// whereTime() // ->whereTime('created_at', '=', '1:20:45')
// protected $dates = [‘edited_at’];
// The following are the comparison functions of Carbon.
eq() - equals
ne() - not equals
gt() - greater than
gte() - greater than or equals
lt() - less than
lte() - less than or equals
Example:
if($model->edited_at->gt($model->created_at)){
// edited at is newer than created at
}
 

StalkerClasses

Новичок
Можно и без макро - я для атрибутов сделал перехват.
Все функции которые имеют в конце Attribute в конце перехватывает перехватчик -

Вот здесь сделано очень мало вариантов функция для фильтрации (where) атрибутов

А у меня получается можно использовать любой стандартны Where-запросы и Order-запросы применительно к атрибутам.


У меня вопрос в другом получается мне нужно создать следующие функции

// whereDateTimestamp()
// whereMonthTimestamp()
// whereDayTimestamp()
// whereYearTimestamp()
// whereTimeTimestamp()

Так?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
ТС, я бы раз 10 уже исправил этот идиотизм с хранением, а не искал бы решения по удалению гланд ректальным методом.
 

StalkerClasses

Новичок
ТС, я бы раз 10 уже исправил этот идиотизм с хранением, а не искал бы решения по удалению гланд ректальным методом.
Я точно хочу убедиться что Laravel не поддерживает конвертацию данных вот в таком случае - сейчас функции whereDate исходник посмотрю.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Мне это никогда не мешало сделать форк и подпилить под себя, но это гемор
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Руками, как и всегда. А что за фреймворк такой?
 

Yoskaldyr

"Спамер"
Партнер клуба
Таймстампы, вещь полезная и более универсальная и переносимая чем datetime поля, если уметь их готовить (например, коробочные решения, где надо по минимуму зависеть от настроек базы часового пояса и т.д.).
Но если уметь их готовить то вопросов как у ТС в принципе не возникает.

И вот действительно большой совет ТС учись задавать вопросы, пиши конкретнее - есть такой продукт/код, хочу добавить что-то и то то.
Не пытайся писать абстрактно и оторванно от задачи - у тебя это не получается.
 

StalkerClasses

Новичок
Руками, как и всегда. А что за фреймворк такой?
Производный от симфони.
Таймстампы, вещь полезная и более универсальная и переносимая чем datetime поля, если уметь их готовить (например, коробочные решения, где надо по минимуму зависеть от настроек базы часового пояса и т.д.).
Но если уметь их готовить то вопросов как у ТС в принципе не возникает.

И вот действительно большой совет ТС учись задавать вопросы, пиши конкретнее - есть такой продукт/код, хочу добавить что-то и то то.
Не пытайся писать абстрактно и оторванно от задачи - у тебя это не получается.

PHP:
    /**
     * Add a "where day" statement to the query.
     *
     * @param  string  $column
     * @param  string  $operator
     * @param  \DateTimeInterface|string|null  $value
     * @param  string  $boolean
     * @return $this
     */
    public function whereDay($column, $operator, $value = null, $boolean = 'and')
    {
        [$value, $operator] = $this->prepareValueAndOperator(
            $value, $operator, func_num_args() === 2
        );

        $value = $this->flattenValue($value);

        if ($value instanceof DateTimeInterface) {
            $value = $value->format('d');
        }

        if (! $value instanceof Expression) {
            $value = str_pad($value, 2, '0', STR_PAD_LEFT);
        }

        return $this->addDateBasedWhere('Day', $column, $operator, $value, $boolean);
    }

    /**
     * Add a date based (year, month, day, time) statement to the query.
     *
     * @param  string  $type
     * @param  string  $column
     * @param  string  $operator
     * @param  mixed  $value
     * @param  string  $boolean
     * @return $this
     */
    protected function addDateBasedWhere($type, $column, $operator, $value, $boolean = 'and')
    {
        $this->wheres[] = compact('column', 'type', 'boolean', 'operator', 'value');

        if (! $value instanceof Expression) {
            $this->addBinding($value, 'where');
        }

        return $this;
    }

Посмотрел например функцию whereDate - здесь нет никаких настроек для преобразований в timestamp.


Полагаю можно изменить 1 функцию "addDateBasedWhere".
В модели завести переменную protected $timestamp2date = [];

Если это поле перечислено, то в "addDateBasedWhere" будет делаться проверка и будет делаться FROM_UNIXTIME(111885200, '%d')
 

StalkerClasses

Новичок
Таймстампы, вещь полезная и более универсальная и переносимая чем datetime поля, если уметь их готовить (например, коробочные решения, где надо по минимуму зависеть от настроек базы часового пояса и т.д.).
Но если уметь их готовить то вопросов как у ТС в принципе не возникает.

И вот действительно большой совет ТС учись задавать вопросы, пиши конкретнее - есть такой продукт/код, хочу добавить что-то и то то.
Не пытайся писать абстрактно и оторванно от задачи - у тебя это не получается.
Есть ларавель и его модели.
Хочу искать по полям типа timestamp где храняться даты через функции whereDate(), whereTime().
Как это реализовать?

Вот и весь вопрос.
 

StalkerClasses

Новичок
Вот я поймал функцию whereDay()
PHP:
<?php
namespace Model;

use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Eloquent\Builder;

class CustomEloquentBuilder extends Builder
{
    /**
     * Dynamically handle calls into the query instance.
     *
     * @param  string  $method
     * @param  array  $parameters
     * @return mixed
     */
    public function __call($method, $parameters)
    {
        getModel
        select
        whereDay    // -->!!!
        take
        hydrate

        print $method.'<br />'; // whereDay
Осталось поймать функцию: addDateBasedWhere()
 

Yoskaldyr

"Спамер"
Партнер клуба
Когда я писал насчет таймстампов я имел ввиду хранение даты/времени в unix тайме (т.е. int). Но у тебя похоже именно timestamp тип.
Если честно стараюсь избегать как timestamp так и datetime поля в базе. Особенно если нужно несколько часовых поясов и т.д.
Преобразования времени пусть лучше происходят в одном месте, только на уровне пхп, а не в 2-х и пхп и база.
Но это имхо.
 

AnrDaemon

Продвинутый новичок
Если честно стараюсь избегать как timestamp так и datetime поля в базе. Особенно если нужно несколько часовых поясов и т.д.
В подавляющем большинстве случаев, DATETIME в БД это дата без TZ. Так что хранить можно, если
Преобразования времени пусть лучше происходят в одном месте, только на уровне пхп, а не в 2-х и пхп и база.
 

StalkerClasses

Новичок
В админке у меня есть поле дата, датавремя, или просто время - всплывающий календарь всем известный (типовой).


В БД у меня данные поля храняться как INT-значения:
date_create int(11) [0] или int(10) unsigned [0]
date_update int(11) [0] или int(10) unsigned [0]

Делаю: создаю кастомный класс CustomEloquentBuilder от Illuminate\Database\Eloquent\Builder
в нем переопределяю функцию
Код:
    /**
     * Add a date based (year, month, day, time) statement to the query.
     *
     * @param  string  $type
     * @param  string  $column
     * @param  string  $operator
     * @param  mixed  $value
     * @param  string  $boolean
     * @return $this
     */
    protected function addDateBasedWhere($type, $column, $operator, $value, $boolean = 'and')
    {
И сейчас посмотрим что получится.
 

Yoskaldyr

"Спамер"
Партнер клуба
В подавляющем большинстве случаев, DATETIME в БД это дата без TZ
А потом оказывается что появляется TZ :)
Или интересные моменты связанные с невалидной датой. Сначала база была на сервере с одной TZ а потом после переезда стала на другой.
Т.е. когда девопсы и разработчики понимают что они делают, то вообще пофигу в чем хранить, но обычно как раз наоборот :)
 

Yoskaldyr

"Спамер"
Партнер клуба
ооо, если как Int - значит именно int в unixtimestamp. потому что у мускуля есть тип данных timestamp тоже.
Но тогда вопрос - в какой часовом поясе надо все выбирать? И как именно писали этот таймстамп?
 
Сверху