Изменить имя созданных и обновленных файлов Laravel_at

#php #mysql #laravel #laravel-4

#php #mysql #laravel #laravel-4

Вопрос:

Могу ли я сопоставить временные метки Laravel с:

created_at на post_date и post_date_gmt ?

updated_at на post_modified и post_modified_gmt ?


Я переношу приложение WordPress на Laravel.

Я получаю доступ к копии базы данных WordPress с помощью Laravel. Живая версия базы данных все еще используется, поэтому я не хочу менять схему.

В таблице Posts есть post_date , post_date_gmt , post_modified и post_modified_gmt , но Laravel ожидает created_at и updated_at .

Есть ли возможность изменить имена столбцов, которые ищет Laravel?

Я бы хотел, чтобы Laravel обновил временные метки всех столбцов, которые уже есть.

Ответ №1:

К сожалению, принятый ответ может вызвать проблемы с обновлением временных меток.

Вам лучше переопределить consts в вашей модели:

 const CREATED_AT = 'post_date';
const UPDATED_AT = 'post_modified';
  

тогда методы getCreatedAtColumn and getUpdatedAtColumn вернут post_date и post_modified соответственно, но не причинят никакого вреда.

Для других столбцов вам нужно использовать события, подобные предложенным @Oni.

Комментарии:

1. Можете ли вы объяснить, как принятый ответ может вызвать проблемы? Я заинтригован.

2. Класс Eloquent Model ссылается на static::CREATED_AT и static::UPDATED_AT в некоторых методах, также в том конкретном 2, который переопределяет @Oni. Таким образом, жесткое кодирование столбцов в этих методах сделало бы красноречивый поиск created_at и updated_at в любом случае при обновлении временных меток ( updateTimestamps например, метод). То же самое касается DELETED_AT случаев, когда используются мягкие удаления.

3. Хм, это похоже на возможную ошибку в Laravel (в том смысле, что он должен использовать методы, а не константы), верно?

4. Если вы переопределяете consts, влияет ли это только на модель, в которой вы их устанавливаете, или она также переопределяет модель, которую она расширяет, поэтому влияет на все модели?

5. Конечно, только модель, в которую вы их устанавливаете, И все, что наследуется от нее, но не родительский класс — EloquentModel .

Ответ №2:

Если вы посмотрите на источник Eloquent класса

https://github.com/illuminate/database/blob/4.2/Eloquent/Model.php#L223-L235

Вы должны иметь возможность довольно легко изменять имена этих столбцов, переопределяя эти константы.

 <?php

class YourModel extends Eloquent {

    /**
     * The name of the "created at" column.
     *
     * @var string
     */
    const CREATED_AT = 'post_date';

    /**
     * The name of the "updated at" column.
     *
     * @var string
     */
    const UPDATED_AT = 'post_modified';

}
  

Что касается _gmt версии этих временных меток, возможно, вы захотите изучить events . Вот хорошее начало

http://driesvints.com/blog/using-laravel-4-model-events

Комментарии:

1. Проверьте мой ответ, так как это приведет к неожиданному поведению.

2. Я снова заглянул в исходный код, и, как сказал декзо, код, который я предоставляю, приведет к ошибке, когда дело доходит до других методов, использующих статические константы. Я обновил пример кода, чтобы отразить предложение deczo.

3. И для laravel9: github.com/illuminate/database/blob/9.x/Eloquent/Model.php#L189

4. Осторожно! класс YourModel расширяет модель, а не Eloquent.

Ответ №3:

Просто поместите это в файл модели таблиц,

  const CREATED_AT = 'your_custom_created_at_field_name';
 const UPDATED_AT = 'your_custom_updated_at_field_name';
  

Моя модель выглядит так, чтобы избежать путаницы

 class diarymodule extends Model
{
    protected $table = 'diarymodule';
    const CREATED_AT = 'CreatedDate';
    const UPDATED_AT = 'UpdatedDate';
}
  

Комментарии:

1. чем этот ответ отличается от принятого ответа?

Ответ №4:

Вы могли бы попробовать использовать методы получения и получения атрибутов:

 class Post extends Eloquent
{
    public function getCreatedAtAttribute()
    {
        return $this->attributes['post_date'];
    }

    public function setCreatedAtAttribute($value)
    {
        $this->attributes['post_date'] = $value;

        // this may not work, depends if it's a Carbon instance, and may also break the above - you may have to clone the instance
        $this->attributes['post_date_gmt'] = $value->setTimezone('UTC');
    }
}
  

Я не знаю, сработает ли это, но вы могли бы попробовать. Конечно, база для продолжения, возможно, вам придется с ней поиграть.

Комментарии:

1. О, игнорируйте это, Oni намного лучше!

2. Это не точное решение.. Laravel уже предоставляет const для полей временных меток. @jarek-tkaczyk дал правильные решения