Вимкнути красномовні часові позначки Ларавеля


186

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

Я знаю, що можу встановити $timestamps = false;:

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

Однак я б краще не міняв основний файл для Laravel, або в усіх моїх моделей це було б у верхній частині. Чи є спосіб відключити це деінде для всіх моделей?

Відповіді:


360

Вам або потрібно заявити public $timestamps = false;у кожній моделі, або створити BaseModel, визначити її там, і всі ваші моделі розширити її замість красномовного. Просто майте на увазі зведені таблиці, ПОВИННІ мати часові позначки, якщо ви використовуєте Красномовний.

Оновлення: Зверніть увагу, що часові позначки більше не ЗАПОВІДНІ в зведених таблицях після Laravel v3.

Оновлення: Ви також можете відключити часові позначки, видаливши $table->timestamps()з міграції.


1
Не знаю, чому я ніколи не думав робити BaseModel і встановлювати його там. Працює прекрасно. Просто примітка згідно з документацією зведені таблиці потрібна лише у тому випадку, якщо зараз встановити позначки з позначками Times () (не знаю, чи змінилося це від попередніх версій)
projectxmatt

Не був в курсі методу withTimestamps (). Мені потрібно буде розглянути.
bgallagh3r

@ bgallagh3r, чи в будь-якому випадку можна здійснити діагностику лише для запитів perticuler, Дозвольмо сказати, що для відображення fontend я не хочу часової позначки, але для бекенду я хочу марку часу. Чи все-таки це зробити?
користувач7747472

10
Видаляючи $ table-> timetamps () з міграції, красномовно все одно буде включати їх у запит. Це призводить до помилки, оскільки поля не існує. Інакше чудова відповідь.
Thijs Steel

115

Просто розмістіть цей рядок у своїй моделі :

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
{
    //
}

22

Якщо вам потрібно лише відключити оновлення update_at, просто додайте цей метод до своєї моделі.

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

Це змінить метод батьківського setUpdatedAtAttribute (). create_at буде працювати як завжди. Таким же чином ви можете написати метод відключення лише оновлення create_at.


2
Це працювало для мене, тому що встановлення $ timestamps = false викликало метод create_at-> diffForHumans (), щоб припинити роботу, оскільки це вже не примірник вуглецю.
Нівін

Це працює для мене, цей метод просто відключить поле updated_at, яке мені потрібно, дякую
Radames E. Hernandez

22

Якщо ви використовуєте 5.5.x:

const UPDATED_AT = null;

А для поля "created_at" ви можете використовувати:

const CREATED_AT = null;

Переконайтеся, що ви перебуваєте в новітній версії. (Це було порушено в Laravel 5.5.0 та зафіксовано знову в 5.5.5).


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оголосіть змінну часових позначок у вашому Modelдо, 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
Випадок "це працює, але ніхто з їх розумом насправді цього не зробив би"
developerbmw

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.