在 php artisan tinker 中保存更改

Posted

技术标签:

【中文标题】在 php artisan tinker 中保存更改【英文标题】:Saving changes in php artisan tinker 【发布时间】:2019-10-24 20:36:40 【问题描述】:

我正在做一个 Laravel 项目。首先,运行迁移并为表创​​建蓝图:

php artisan migrate 

我通过创建具有以下结构的架构来编辑迁移

Schema::create('donations', function (Blueprint $table) 
          $table->string('email');
          $table->string('about');
          $table->timestamp('created_at')->nullable();

接下来,我使用修补程序编辑器创建了名为 Donation 的模型

php artisan make:model Donation 

但是,我无法保存更改并填充新创建的表,因为当我尝试保存编辑时遇到了错误。下面,我发布了我的编辑和我得到的错误。

$donation = new App\Donation;
=> App\Donation #2934

>>> $donation->email = 'pele@gmail.com'
=> "pele@gmail.com"
>>> $donation->about = '1M donation'
=> "1M donation"

>>> $donation 
=> App\Donation #2934
     email: "pele@gmail.com",
     about: "1M donation",

 $donation->save();

错误

Illuminate/Database/QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'updated_at' in 'field list' (SQL: insert into `donations` (`email`, `about`, `updated_at`, `created_at`) values (pele@gmail.com, 1M donation, 2019-06-10 12:19:04, 2019-06-10 12:19:04))'

【问题讨论】:

public $timestamps = false; 内部模型 @DrakulaPredator 你的意思是你的代码应该进入修补编辑器吗? 我不知道,我的意思是,编辑您的模型已创建,并在那里写下我的 sn-p 并检查 在将您的代码添加到 tinker 编辑器且未保存更改后出现此错误:PHP Parse error: Syntax error, unexpected T_PUBLIC on line 1 我通过在模型类中添加我的 sn-p 解决了这个问题。我不知道 Tinker。 【参考方案1】:

目前,您的迁移文件未使用 $table->timestamps() 方法,该方法将创建 created_atupdated_at 日期时间字段。

当尝试使用 tinker 保存新记录时,模型期望同时保存 created_atupdated_at 字段。如果您想在没有 updated_at 字段的情况下继续前进,请将以下内容添加到您的 Donation 模型中:

public $timestamps = false;

否则,您可以通过替换来解决问题:

$table->timestamp('created_at')->nullable();

与:

$table->timestamps();

注意:这将使created_at 字段不可为空,这意味着它总是需要一个值。但是,在创建/保存时会自动设置。

【讨论】:

【参考方案2】:

默认情况下使用 Eloquent 模型假定您的表中有 created_at 和 updated_at 字段,但在您的情况下,您只使用 created_at 字段。 因此,当使用模型保存记录时,它会尝试保存 updated_at 但您没有。 要解决此问题,您可以通过

禁用时间戳
public $timestamps = false;

【讨论】:

【参考方案3】:

对我的模型的这种更改解决了我的问题:

namespace App;

use Illuminate\Database\Eloquent\Model;


class Donation extends Model

 public $timestamps = false;


另外,我必须退出修补程序编辑器,然后运行以下命令才能使其工作:

$donation = new App\Donation();
$donation->email = 'random@gmail.com'
$donation->about = '1M from Pele'
$donation->save();

最终,在向模型添加新行后重新进入修补程序并从头开始添加更改会有所帮助。

【讨论】:

以上是关于在 php artisan tinker 中保存更改的主要内容,如果未能解决你的问题,请参考以下文章

PHP Artisan Tinker 无法写入配置路径

laravel 5.5:php artisan tinker:ErrorException:目录不为空[重复]

无法从产品表中指定“标题” - php artisan tinker

PHP Artisan Tinker 从任何命令崩溃

PHP 致命错误:在第 1 行 Laravel Artisan Tinker 的 eval() 代码中调用未定义函数 table()

如何使 php artisan tinker 显示完整的错误(消息)?