как использовать только созданные в laravel


Все.

Я новичок в laravel.

Вот мои вопросы:

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

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

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

public $timestamps = false;

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

 36
Author: refear99, 2015-04-27

13 answers

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

class User extends Eloquent {

    public $timestamps = false;

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

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

}
 56
Author: Joseph Silber, 2016-11-05 23:58:26

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

const UPDATED_AT = null;

И для поля "created_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(); 
}

Когда требуются два поля "created_at" и "updated_at", вам, конечно, ничего не нужно делать;)

 39
Author: Rodolfo Jorge Nemer Nogueira, 2017-09-24 21:16:33

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

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

class User extends Model
{
    public $timestamps = false; // disable all behaviour
    public $timestamps = true; // enable all behaviour
    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 that true
}

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

public $timestamps = [ "created_at" ]; // enable only to created_at
 14
Author: Abrar Jahin, 2016-12-30 00:03:56

Мое решение:

class CreatePostsTable extends Migration {

   public function up() {

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

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

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

 13
Author: Dan, 2015-07-29 12:46:01

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

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

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

 3
Author: sathish R, 2017-06-02 06:43:55

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

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

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

 2
Author: absolux, 2015-08-07 20:00:25

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

Метод класса модели performUpdate вызывает метод класса построителя:

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

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

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

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

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

Итак, в вашем классе моделей добавьте эти:

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

public function getUpdatedAtColumn()
{
    return null;
}

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

 2
Author: JustAMartin, 2015-08-21 09:11:56

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

 2
Author: m0rPh1n3, 2017-01-23 16:54:13

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

См.:

class MyModel extends Eloquent {

    public $timestamps = false;

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

            $this->attributes['created_at'] = $this->freshTimestamp();
    }
}
 1
Author: Wallace Maxters, 2015-07-09 15:23:14

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

1) Создайте SetCreatedAt наблюдателя в 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, но оно должно работать и с предыдущими версиями.

Удачи!

 1
Author: Arian Acosta, 2017-03-15 23:06:08

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

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

public function setUpdatedAtAttribute($value)
{
    // auto disable update_at in inserts
}
 0
Author: Vandolph Reyes, 2017-05-27 02:22:32

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

public $timestamps = false;

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

 0
Author: Leonid Serdiuk, 2017-09-15 07:01:21

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

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

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

}

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

 -1
Author: Sampath Perera, 2016-06-27 03:57:06