Отключить метки времени Eloquent в Laravel


202

Я сейчас конвертирую одно из наших веб-приложений с CodeIgniter в Laravel. Однако в данный момент мы не хотим добавлять поля updated_at/ created_atко всем нашим таблицам, поскольку у нас есть класс ведения журнала, который уже делает все это более подробно за нас.

Я знаю, что могу установить $timestamps = false;:

Vendor\laravel\framework\src\illuminate\Datebase\Eloquent\Model.php

Однако я бы предпочел не менять основной файл для Laravel, иначе он должен быть у всех моих моделей вверху. Есть ли способ отключить это где-либо еще для всех моделей?

Ответы:


383

Вы должны либо объявить public $timestamps = false;в каждой модели, либо создать BaseModel, определить ее там и заставить все ваши модели расширять ее, а не красноречиво. Просто помните, что сводные таблицы ДОЛЖНЫ иметь метки времени, если вы используете Eloquent.

Обновление: обратите внимание, что временные метки больше не ТРЕБУЮТСЯ в сводных таблицах после Laravel v3.

Обновление: вы также можете отключить временные метки, удалив их $table->timestamps()из миграции.


1
Не знаю, почему я никогда не думал о создании BaseModel и установке ее там. Красиво работает. Просто примечание, согласно сводным таблицам документации, оно нужно только при установке withTimestamps () сейчас (не знаю, изменилось ли это по сравнению с предыдущими версиями)
— projectxmatt

Не знал о методе withTimestamps (). Мне нужно разобраться в этом.
— bgallagh3r

@ bgallagh3r, есть ли способ diasble только для запроса perticuler. Допустим, для отображения внешнего интерфейса мне не нужна временная метка, но для бэкэнда мне нужна временная метка. Есть ли способ это сделать?
— user7747472

13
При удалении $ table-> timestamps () из миграции Eloquent по-прежнему будет включать их в запрос. Это приводит к ошибке, так как поле не существует. В противном случае отличный ответ.
— Thijs Steel

Да, это все еще так (Laravel Framework v7.22.4). Нашел эту тему, пытаясь обойти эту проблему. Вы должны явно отключить временные метки с помощью $timestamps = false;, например, к семени таблице , которая не имеет никакого created_atи updated_atполе.
— CLN

127

Просто поместите эту строку в свою модель :

public $timestamps = false;

Вот и все!


Пример:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public $timestamps = false;

    //
}

Чтобы отключить отметки времени для одной операции (например, в контроллере):

$post->content = 'Your content'; 
$post->timestamps = false; // Will not modify the timestamps on save
$post->save();

Чтобы отключить временные метки для всех ваших моделей , создайте новый BaseModelфайл:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model
{
    public $timestamps = false;

    //
}

Затем расширьте каждую из ваших моделей BaseModel, например:

<?php

namespace App;

class Post extends BaseModel
{
    //
}

25

Если вы используете 5.5.x:

const UPDATED_AT = null;

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

const CREATED_AT = null;

Убедитесь, что вы используете последнюю версию. (Это было сломано в Laravel 5.5.0 и снова исправлено в 5.5.5).


23

Если вам нужно только отключить обновление updated_at, просто добавьте этот метод в свою модель.

public function setUpdatedAtAttribute($value)
{
    // to Disable updated_at
}

Это переопределит родительский метод setUpdatedAtAttribute (). created_at будет работать как обычно. Таким же образом вы можете написать метод для отключения обновления только created_at.


2
Это сработало для меня, потому что установка $ timestamps = false привела к тому, что метод created_at-> diffForHumans () перестал работать, поскольку он больше не является экземпляром углерода.
— ralixyle

У меня работает, этот метод просто отключает поле updated_at, которое мне нужно, спасибо
— Радамес Э. Эрнандес

11

Красноречивая модель:

class User extends Model    
{      
    protected $table = 'users';

    public $timestamps = false;
}

Или просто попробуйте это

$users = new Users();
$users->timestamps = false;
$users->name = 'John Doe';
$users->email = 'johndoe@example.com';
$users->save();

9

Если вы хотите удалить временные метки из существующей модели, как упоминалось ранее, поместите это в свою модель:

public $timestamps = false;

Также создайте миграцию со следующим кодом в up()методе и запустите ее:

Schema::table('your_model_table', function (Blueprint $table) {
    $table->dropTimestamps();
});

Вы можете использовать $table->timestamps()в своем down()методе возможность отката.


1
Это должен быть лучший ответ. Если у вас есть производственная база данных, вам нужно будет запустить миграцию, а также отключить временные метки на модели.
— Брэд

7

просто объявите publicпеременную timestamps в вашем Modelto, falseи все будет отлично работать.

public $timestamps = false;


5

Добавьте эту строку в свою модель:

Заменить существующую переменную $timestamps true на false

/**
 * Indicates if the model should be timestamped.
 *
 * @var bool
 */

public $timestamps = false;

1

Переопределите функции setUpdatedAt()и getUpdatedAtColumn()в вашей модели

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

public function getUpdatedAtColumn()
{
    //Do-nothing
}

20
Случай «это работает, но никто в здравом уме на самом деле этого не сделает»
— разработчик

1

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

$timestamps = $user->timestamps;
$user->timestamps=false;   // avoid view updating the timestamp

$user->last_logged_in_at = now();
$user->save();

$user->timestamps=$timestamps;   // restore timestamps
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.