#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
. Вот хорошее начало
Комментарии:
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 дал правильные решения