【问题标题】:Laravel 5.7: Why do my model create() and save() methods create 2 records when called?Laravel 5.7:为什么我的模型 create() 和 save() 方法在调用时会创建 2 条记录?
【发布时间】:2019-03-07 13:27:38
【问题描述】:

我在 Apache 上使用 mysql DB,Laravel 5.7。

我已经有一个完整的系统在运行,一切似乎都很好,除了......我决定开始使用一些 eloquent factory 进行测试,并注意到当我保存/创建一个时,这些工厂在 mysql 中创建了 2 个条目模型。所以我简化了,并创建了我自己的“makeFake”方法,发现它在做同样的事情。我不知道我做错了什么。或者也许框架的某些区域我不完全理解。

主要问题:为什么我的模型 create() 和 save() 方法在调用时会创建 2 条记录?

下面的简化案例...(在这种情况下,我调用了 2 个方法来创建公司,但我得到了 4 个公司记录)

来自我的 web.php

Route::get('/savingTest', function () {

    $company = App\Company::makeFake1();
    dump($company);

    $company = App\Company::makeFake2();
    dump($company);

    return 'complete';
});

来自我的 Company.php 模型(我已经加载了 faker 和 GUID 库)

public static function makeFake1()
{
    $faker = Faker::create();
    $company = new Company;
    $company->code = $faker->word;
    $company->name = $faker->company;
    $company->guid = Guid::create();
    $company->save();
    return $company;
}

public static function makeFake2()
{
    $faker = Faker::create();
    return Company::create([
        'code' => $faker->word,
        'name' => $faker->company,
        'guid' => Guid::create(),
    ]);

}

【问题讨论】:

  • 请将您的代码复制到您的问题中,不要使用图片。
  • 你刷新路线了吗?清理您的数据库表并再次测试。
  • 代码编辑器,只有 JS 和 HTML 和 CSS 部分,没有 PHP。是不是直接放进JS盒子里?
  • 不,放在问题的主体上,选择代码并使用 CTRL + K 。你应该看看这个:stackoverflow.com/help/how-to-ask
  • 已编辑以用代码替换图像。

标签: php laravel laravel-5 eloquent model


【解决方案1】:

save() (new) 和 create() 有区别

Laravel Mass Assignment

Laravel Inserts

当您调用 create() 时,它会立即创建一个新的 eloquent 模型项并将其提交到数据库。

当您调用新方法时,它会创建 eloquent 模型项,但不会将其提交到数据库。

如果你想根据其他因素修改项目中的项目,那么在最后使用 new 后跟 save() 。如果您想使用纯数据批量创建项目,请使用 create() 函数。

因此,以下代码创建了 2 个项目:

$faker = Faker::create(); // First Record created
$company = new Company;
$company->code = $faker->word;
$company->name = $faker->company;
$company->guid = Guid::create();
$company->save(); // Second Record created

【讨论】:

  • 这部分“$faker = Faker::create(); // First Record created”正在对不同的对象进行操作。伪造者的对象,而不是公司。为什么会创建公司记录?
  • 嗯,公平点,您是否考虑过安装 Debugbar 来帮助诊断问题并查看运行的查询?
  • 感谢您的帮助。事实证明,我的 Laravel 安装可能已损坏。请参阅我对这个问题的回答。
  • 您的数据库配置文件中没有任何重复的内容吗?
  • Petay87 - 你可能正在做某事。我最近确实对 /config/database.php 文件进行了更改。我刚刚添加了一个 sqlite_testing 部分。但是,我使用的是mysql,所以我没有想到它。也许现在文件中有一个错字导致某种雄辩的混乱。我将尝试一个 vanilla database.php 文件,看看是否有什么不同。
【解决方案2】:

在这里回答我自己的问题:

我发现了这个问题……太令人沮丧了。

我一直在努力查看我的代码在哪里出错,但我发现 Chrome 浏览器正在发送双重请求。当我在 URL 栏中输入 http://127.0.0.1:8000/test1 时,Chrome 会向 Web 服务器发送两个 get 请求,而不是一个。

IE 运行良好,Firefox 运行良好。

【讨论】:

    猜你喜欢
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2020-08-01
    • 1970-01-01
    相关资源
    最近更新 更多