【问题标题】:Disable Laravel's Eloquent timestamps禁用 Laravel 的 Eloquent 时间戳
【发布时间】:2013-11-25 02:19:49
【问题描述】:

我正在将我们的一个 Web 应用程序从 CodeIgniter 转换为 Laravel。但是此时我们不想将updated_at / created_at 字段添加到我们所有的表中,因为我们有一个日志记录类已经为我们做了更深入的所有这些。

我知道我可以将$timestamps = false; 设置为:

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

但是,我宁愿不更改 Laravel 的核心文件,或者让我的每个模型都将其放在顶部。有没有办法在其他地方为所有模型禁用此功能?

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    只需将此行放在您的模型中

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

    【讨论】:

      【解决方案2】:

      您可以暂时禁用时间戳

      $timestamps = $user->timestamps;
      $user->timestamps=false;   // avoid view updating the timestamp
      
      $user->last_logged_in_at = now();
      $user->save();
      
      $user->timestamps=$timestamps;   // restore timestamps
      

      【讨论】:

        【解决方案3】:

        将此行添加到您的模型中:

        覆盖现有变量$timestamps truefalse

        /**
         * Indicates if the model should be timestamped.
         *
         * @var bool
         */
        
        public $timestamps = false;
        

        【讨论】:

          【解决方案4】:

          如果您想从现有模型中删除时间戳,如前所述,请将其放在您的模型中:

          public $timestamps = false;
          

          还可以在up() 方法中使用以下代码创建迁移并运行它:

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

          您可以在down() 方法中使用$table-&gt;timestamps() 来允许回滚。

          【讨论】:

          • 这应该是最好的答案。如果您有现有的生产数据库,则需要运行迁移并在模型上禁用时间戳。
          【解决方案5】:

          只需将Model 中的public 时间戳变量声明为false,一切都会很好。

          public $timestamps = false;

          【讨论】:

            【解决方案6】:

            如果您使用的是 5.5.x:

            const UPDATED_AT = null;
            

            对于“created_at”字段,您可以使用:

            const CREATED_AT = null;
            

            确保您使用的是最新版本。 (这在 Laravel 5.5.0 中被破坏并在 5.5.5 中再次修复)。

            【讨论】:

              【解决方案7】:

              雄辩模型:

              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();
              

              【讨论】:

                【解决方案8】:

                您要么必须在每个模型中声明 public $timestamps = false;,要么创建一个 BaseModel,在那里定义它,然后让所有模型扩展它而不是 eloquent。请记住,如果您使用 Eloquent,数据透视表必须有时间戳。

                更新:请注意,在 Laravel v3 之后,数据透视表中不再需要时间戳。

                更新:您还可以通过从迁移中删除 $table-&gt;timestamps() 来禁用时间戳。

                【讨论】:

                • 不知道为什么我从来没想过做一个 BaseModel 并将其设置在那里。工作精美。仅当现在设置 withTimestamps() 时才需要根据文档数据透视表进行注释(不知道这是否与以前的版本有所不同)
                • 不知道 withTimestamps() 方法。我需要调查一下。
                • @bgallagh3r,无论如何只能为 perticuler 查询禁用,可以说对于字体显示我不想要时间戳,但对于后端我想要时间戳。有什么办法吗?
                • 当从迁移中移除 $table->timestamps() 时,eloquent 仍然会将它们包含在查询中。这会导致错误,因为该字段不存在。否则很好的答案。
                • 是的,今天仍然如此(Laravel Framework v7.22.4)。发现这个线程试图解决这个问题。您必须通过$timestamps = false; 明确禁用时间戳,例如,为没有任何created_atupdated_at 字段的表设置种子。
                【解决方案9】:

                覆盖模型中的函数setUpdatedAt()getUpdatedAtColumn()

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

                【讨论】:

                • 一个案例“它有效,但没有一个头脑正常的人会真正做到这一点”
                【解决方案10】:

                如果您只需要禁用更新 updated_at 只需将此方法添加到您的模型。

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

                这将覆盖父 setUpdatedAtAttribute() 方法。 created_at 将照常工作。 同样的方法你可以编写一个方法来禁用更新 created_at 。

                【讨论】:

                • 这对我有用,因为设置 $timestamps = false 导致 created_at->diffForHumans() 方法停止工作,因为它不再是碳实例。
                • 它对我有用,这个方法只是禁用了我需要的 updated_at 字段,谢谢
                猜你喜欢
                • 1970-01-01
                • 2020-12-25
                • 2016-02-16
                • 2019-03-14
                • 1970-01-01
                • 2016-02-17
                • 1970-01-01
                • 2020-11-09
                • 1970-01-01
                相关资源
                最近更新 更多