Laravel 5.7: Почему мои методы create () и save () создают 2 записи при вызове? - PullRequest
0 голосов
/ 07 марта 2019

Я использую mysql DB, Laravel 5.7 на Apache.

У меня уже запущена полная система, и все вроде бы нормально, кроме ... Я решил начать использовать некоторые красноречивые фабрики для тестированияи заметил, что фабрики делали 2 записи в MySQL, когда я сохраняю / создаю модель.Поэтому я упростил и создал свой собственный метод «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(),
    ]);

}

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Существует разница между save () (new) и create ()

Назначение массы Laravel

Вставки Laravel

Когда вы вызываете create (), он мгновенно создает новый красноречивый элемент модели и фиксирует его в базе данных.

Когда вы вызываете новый метод, он создает элемент красноречивой модели, но НЕ фиксирует его в базе данных.

Если вы хотите изменить элементы в элементе в зависимости от других факторов, используйте 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
0 голосов
/ 07 марта 2019

Отвечая на мой собственный вопрос здесь:

Я нашел проблему .... очень расстраивает.

Я изо всех сил пытался увидеть, где мой код был сломан, но я обнаружил, что ChromeБраузер отправляет двойные запросы.Когда я набираю http://127.0.0.1:8000/test1 в строке URL-адреса, Chrome отправляет ДВУХ запросов на получение веб-сервера, а не одного.

IE работает нормально, а Firefox работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...