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

202

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

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

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

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

Projectxmatt
источник

Ответы:

383

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

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

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

bgallagh3r
источник
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
Снейпи
источник