Подтвердить что ты не робот

Как использовать только create_at в Laravel

Я хочу использовать только create_at, как это сделать?

Я знаю:

Это может пользовательское имя метки времени

const CREATED_AT = 'created';
const UPDATED_AT = 'updated';

Это может отключить метки времени

public $timestamps = false;
4b9b3361

Ответ 1

Eloquent не предоставляет такую ​​функциональность из коробки, но вы можете создать ее самостоятельно, используя обратный вызов события creating:

class User extends Eloquent {

    public $timestamps = false;

    public static function boot()
    {
        parent::boot();

        static::creating(function ($model) {
            $model->created_at = $model->freshTimestamp();
        });
    }

}

Ответ 2

Используйте сверху:

const UPDATED_AT = null;

А для поля "create_at" вы можете использовать:

const CREATED_AT = null;

ОБНОВЛЕНИЕ LARAVEL 5.5.0 - 5.5.5

Это было сломано в Laravel 5.5.0 (и исправлено снова в 5.5.5).

Если вы используете 5.5.x, убедитесь, что вы используете новейшую версию.

Если по какой-то причине вы не можете использовать новейшую версию, вот обходной путь.

Установите для общедоступных временных отметок $ значение false:

public $timestamps = false;

И когда это необходимо:

public function setCreatedAtAttribute($value) { 
    $this->attributes['created_at'] = \Carbon\Carbon::now(); 
}

ИЛИ ЖЕ

public function setUpdatedAtAttribute($value) { 
    $this->attributes['updated_at'] = \Carbon\Carbon::now(); 
}

Когда обязательны два поля "create_at" и "updated_at", вам, конечно, не нужно ничего делать;)

Ответ 3

У меня есть лучший ответ от здесь для Laravel 5.2 или выше.

Вы можете использовать это в model-

class User extends Model
{
    public $timestamps = false; // disable all behavior
    public $timestamps = true; // enable all behavior
    public $timestamps = [ "created_at" ]; // enable only to created_at
    public $timestamps = [ "updated_at" ]; // enable only to updated_at
    public $timestamps = [ "created_at", "updated_at" ]; // same as true, enable all behavior
}

Итак, на ваш вопрос ответ -

public $timestamps = [ "created_at" ]; // enable only to created_at

Ответ 4

Мое решение:

class CreatePostsTable extends Migration {

   public function up() {

      Schema::create('posts', function(Blueprint $table){

         $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
   });
}

Это работает для меня

Ответ 5

Я решил добавить значение по умолчанию CURRENT_TIMESTAMP в мою базу данных для столбца created_at. И в моей модели я использую этот ниже код

public $timestamps = false;
protected $dates = ['created_at'];

Я надеюсь, что этот метод работает во всех версиях laravel.

Ответ 6

Чтобы отключить only updated_at, вы можете переопределить метод Model:: setUpdatedAt(), например:

public function setUpdatedAt($value) {
    // Do nothing.
}

Конечно, если вы хотите сделать это для столбца created_at, это так же просто. И эта работа для Laravel 5.1

Ответ 7

В версии 5.3 я просто сделал public $timestamps = false;, а затем добавил protected $fillable = ['created_at']. Примечание. Вы можете добавить все, что хотите, просто убедитесь, что оно соответствует таковому в вашей таблице.

Ответ 8

На вашей model установлено

const UPDATED_AT = null;

или же

const CREATED_AT = null;

он останавливает Laravel, пытаясь обновить поле updated_at/creation_at

Работает на Laravel 5.8

И это лучше, чем перезаписать: setUpdatedAt в вашей model

public function setUpdatedAt($value) : self 
{
    // Do nothing.
    return $this;
}

потому что он короче и потому что проверка if (! is_null(static::UPDATED_AT)) происходит в исходном коде раньше, чем запуск setUpdatedAt

Ответ 9

Подход только с setUpdatedAt не работал с Laravel 5.1.7, потому что он имеет еще одно место, где обрабатывается updated_at.

Метод класса executeUpdate метод вызывает метод класса Builder:

public function update(array $values)
{
    return $this->query->update($this->addUpdatedAtColumn($values));
}

что приводит нас к

return Arr::add($values, $column, $this->model->freshTimestampString());

Я не уверен, почему Laravel обрабатывает update_at дважды - в performUpdate с помощью $this->updateTimestamps(), а затем позже в Builder с $this->addUpdatedAtColumn($values).

С некоторой отладкой я обнаружил, что вы также должны обновить свою модель с помощью переопределения getUpdatedAtColumn. Сначала я боялся, что он попытается обновить несуществующее поле "null", но оказалось, что Arr::add достаточно умен, чтобы игнорировать нулевые ключи.

Итак, в вашем классе модели добавьте следующее:

public function setUpdatedAt($value)
{
    // Do nothing.
}

public function getUpdatedAtColumn()
{
    return null;
}

Этого должно быть достаточно, чтобы отключить оба обновления.

Ответ 10

Используйте сверху класс:

const UPDATED_AT = null;

или же

const CREATED_AT = null;

Ответ 11

Для Laravel 5. *

Модель:

//  Disable updated_at (only created_at)
class Book extends Model
{
     const UPDATED_AT = null;

     /* ... */
}

Миграция:

Schema::create('books', function (Blueprint $table): void {
    /* ... */
    $table->timestampTz('created_at')->nullable();
});

Ответ 12

Мое решение для этого - использование нового метода __construct.

См:

class MyModel extends Eloquent {

    public $timestamps = false;

    public function __construct(array $attributes = [])
    {
            parent::__construct($attributes);

            $this->attributes['created_at'] = $this->freshTimestamp();
    }
}

Ответ 13

Решение, которое является простым, развязанным и многоразовым, заключается в использовании Model Observer. Идея состоит в том, чтобы захватить событие creating и заполнить атрибут created_at. Этот метод может использоваться любым количеством моделей без необходимости повторять код или использовать неофициальные трюки. Самое главное, он очень похож на внутреннюю механику класса Model, избегая при этом неожиданных ошибок.

1) Создайте SetCreatedAt observer в App\Observers:

namespace App\Observers;

use Illuminate\Database\Eloquent\Model;

class SetCreatedAt
{
    /**
     * Sets created_at when creating the model.
     *
     * @param Model $model
     * @return void
     */
    public function creating(Model $model)
    {
        $model->setCreatedAt($model->freshTimestamp());
    }
}

2) В App\Providers\AppServiceProvider внутри метода boot добавьте следующую строку для каждой из моделей, для которой вы хотите создать created_at для:

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    // Replace OrderLog with your model
    OrderLog::observe(SetCreatedAt::class);
}

3) На ваших моделях единственное, что вам нужно сделать, это отключить отметки времени:

// Disable timestamps on the model
public $timestamps = false;

Протестировано с Laravel 5.3, но оно должно работать и с предыдущими версиями.

Удачи!

Ответ 14

В 5.4 проблема, которую он дает, состоит в том, что он также не заполняет поле updated_at даже после обновления (Eloquent update).

вместо этого добавьте этот метод

public function setUpdatedAtAttribute($value)
{
    // auto disable update_at in inserts 
}

Ответ 15

Вы можете использовать значение CURRENT_TIMESTAMP по умолчанию для поля created в таблице MySQL и установить

public $timestamps = false;

в вашей модели.

Ответ 16

В Laravel 5.7 этого было достаточно, чтобы он заработал:

В миграции:

$table->timestamp('created_at')->nullable();

вместо классической $table->timestamp('created_at');

В модели:

const UPDATED_AT = null;

Ответ 17

Я использовал очень простой хак;)

класс MyClass расширяет модель {

const CREATED_AT = 'creation_date';
const UPDATED_AT = 'creation_date';

}

Я просто указал оба на тот же столбец:)